尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

实用指南:Android Studio新手开发第二十二天

实用指南:Android Studio新手开发第二十二天
📅 发布时间:2026/6/20 10:06:41

实用指南:Android Studio新手开发第二十二天

2025-11-19 08:53  tlnshuju  阅读(0)  评论(0)    收藏  举报

目录

列表视图ListView

焦点抢占问题及解决方式

列表视图ListView

        列表类视图是 Android 开发中最重要和最常用的组件之一,用于展示大量结构化数据。ListView与Spinner一样通过setAdapter方法设置列表项的数据适配器,但它设置监听器的方法却不同。它通过调用方法setOnItemClickListener设置列表项的点击监听器OnItemClickListener,调用方法setOnitemLongClickListener设置列表项的长按监听器OnItemLongClickListener。列表视图ListView还新增了几个属性以及对应的方法。属性divider指定分割线的图形若不需要分割线只需将该属性的值设为"@null",其对应的方法为setDivider;属性dividerHeight指定分割线的高度,对应方法为setDividerHeight;属性listSelector指定列表项的按压背景,其对应方法为setSelector。代码示例如下,



        button_selector.xml的代码如下。



        部分Java代码如下,数据适配器的内容与下拉框中的用法是一样的,不同在于属性以及对应方法的使用,还有监听器的不同。

public class ListViewActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {private int[] image_id = {R.drawable.one, R.drawable.two, R.drawable.three, R.drawable.four, R.drawable.five,R.drawable.six, R.drawable.seven, R.drawable.eight, R.drawable.nine, R.drawable.zero};private Integer[] number = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};private String[] number_english = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "zero"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list_view);ListView listView = findViewById(R.id.listView);List numberInfoList = getList();listView.setAdapter(new MyBaseAdapter(this, numberInfoList));listView.setSelection(0);listView.setDivider(getDrawable(R.drawable.image_3));listView.setDividerHeight(5);listView.setSelector(R.drawable.button_selector);listView.setOnItemClickListener(this);}@Overridepublic void onItemClick(AdapterView adapterView, View view, int i, long l) {if (adapterView.getId() == R.id.listView) {Toast.makeText(this,String.format("选中了第%d项",i),Toast.LENGTH_SHORT).show();}}public List getList() {List numberInfoList = new ArrayList();for (int i = 0; i < number.length; i++) {NumberInfo numberInfo = new NumberInfo();numberInfo.setImage_id(image_id[i]);numberInfo.setNumber(number[i]);numberInfo.setNumber_english(number_english[i]);numberInfoList.add(numberInfo);}Log.e(TAG, "getList: ");return numberInfoList;}class NumberInfo {private int image_id;private int number;private String number_english;public int getImage_id() {return image_id;}public void setImage_id(int image_id) {this.image_id = image_id;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getNumber_english() {return number_english;}public void setNumber_english(String number_english) {this.number_english = number_english;}}class MyBaseAdapter extends BaseAdapter {private List numberInfoList;private Context mcontext;public MyBaseAdapter(Context context, List list) {super();numberInfoList = list;mcontext = context;}@Overridepublic int getCount() {return numberInfoList.size();}@Overridepublic Object getItem(int i) {return numberInfoList.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;if (view == null) {viewHolder = new ViewHolder();view = LayoutInflater.from(mcontext).inflate(R.layout.item_base, null);viewHolder.imageView = view.findViewById(R.id.imageView);viewHolder.textView_1 = view.findViewById(R.id.textView_1);viewHolder.textView_2 = view.findViewById(R.id.textView_2);view.setTag(viewHolder);} else {viewHolder = (ViewHolder) view.getTag();}NumberInfo numberInfo = numberInfoList.get(i);viewHolder.imageView.setImageResource(numberInfo.getImage_id());viewHolder.textView_1.setText(String.format("%d", numberInfo.getNumber()));viewHolder.textView_2.setText(numberInfo.getNumber_english());viewHolder.imageView.requestFocus();return view;}final class ViewHolder {public ImageView imageView;public TextView textView_1;public TextView textView_2;}}
}

        效果图如下,可以看到列表视图能够展示全部的数据项,这与下拉框不一样,下拉框在选择后只能展示一项的内容。

焦点抢占问题及解决方式

        如果在列表项中有按钮或者编辑框这类控件,当发生点击事件时这类控件会抢占焦点导致列表项的点击监听器失效。为了解决该问题,可以在列表项的布局文件中的的根节点添加属性descendantFocusability并设置其值或者在Java代码中调用方法setdescendantFocusability设置。该属性有三种取值,如下表所示说明。

属性取值代码中的方法参数取值说明

beforeDescendants

ViewGroup.FOCUS_BEFORE_DESCENDANTS

视图组优先:ViewGroup 先于子视图获取焦点

afterDescendants

ViewGroup.FOCUS_AFTER_DESCENDANTS

子视图优先:子视图先于 ViewGroup 获取焦点

blocksDescendants

ViewGroup.FOCUS_BLOCK_DESCENDANTS

阻止子视图:ViewGroup 获取焦点,阻止子视图获取

        代码示例如下,页面布局文件不变。

        下面为item_listview.xml中的代码,在原来的列表项布局中新加了一个按钮并且在布局的根结点添加了属性descendantFocusability并且取值为blocksDescendants。


        Java代码的不同主要在于适配器中,在类ViewHolder中添加了一个按钮button用于获取按钮实例,在方法getView中改变在于与按钮相关的部分,如获取按钮实例以及设置按钮监听器,其余基本不变。

   class MyBaseAdapter extends BaseAdapter {private List numberInfoList;private Context mcontext;public MyBaseAdapter(Context context, List list) {super();numberInfoList = list;mcontext = context;}@Overridepublic int getCount() {return numberInfoList.size();}@Overridepublic Object getItem(int i) {return numberInfoList.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;if (view == null) {viewHolder = new ViewHolder();view = LayoutInflater.from(mcontext).inflate(R.layout.item_listview, null);viewHolder.imageView = view.findViewById(R.id.imageView);viewHolder.textView_1 = view.findViewById(R.id.textView_1);viewHolder.textView_2 = view.findViewById(R.id.textView_2);viewHolder.button = view.findViewById(R.id.button);view.setTag(viewHolder);} else {viewHolder = (ViewHolder) view.getTag();}NumberInfo numberInfo = numberInfoList.get(i);viewHolder.imageView.setImageResource(numberInfo.getImage_id());viewHolder.textView_1.setText(String.format("%d", numberInfo.getNumber()));viewHolder.textView_2.setText(numberInfo.getNumber_english());viewHolder.button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(mcontext,String.format("点击了第%d项的按钮!",i+1),Toast.LENGTH_SHORT).show();}});viewHolder.imageView.requestFocus();return view;}final class ViewHolder {public ImageView imageView;public TextView textView_1;public TextView textView_2;public Button button;}}

        效果图如下,可以看到按钮并没有抢占列表项的焦点,两者的监听器能够正常运行。

相关新闻

  • 2025年评价高的金相预磨机厂家推荐及选择指南
  • 2025年比较好的金相分析厂家最新TOP实力排行
  • 2025年质量好的贵金属电刷厂家选购指南与推荐

最新新闻

  • ARM9微控制器LPC32x0系列:低功耗、高集成度与VFP协处理器的嵌入式设计实践
  • 洛阳市奢侈品手表包包回收价格差距高达15%:实测对比告诉你哪家店报价最实在 - 谊识预商务
  • 14000张高清驾驶员行为数据集:YOLO危险驾驶识别实战基线
  • 濮阳市闲置爱马仕、劳力士变现指南:奢侈品手表包包回收门店实地测评 - 谊识预商贸
  • 大连市奢侈品手表包包回收价格差距高达15%:实测对比告诉你哪家店报价最实在 - 谊识预商贸
  • 曲靖市闲置手表包包奢侈品变现,整理了5家靠谱回收店联系方式 - 谊识预商务

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号