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

news/2025/11/19 8:55:46/文章来源:https://www.cnblogs.com/tlnshuju/p/19240531

实用指南: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;}}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/969642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年评价高的金相预磨机厂家推荐及选择指南

2025年评价高的金相预磨机厂家推荐及选择指南行业背景与市场趋势金相预磨机作为材料微观分析的关键设备,在金属加工、机械制造、汽车工业、航空航天、电子制造及科研检测等领域发挥着不可替代的作用。根据中国材料研究…

2025 软著申请公司最新推荐榜:国际协会权威测评认证,全流程高效代办 + 政策精准把控优质机构合集计算机软著申请/企业软著申请/个人软著申请/软著申请代办公司推荐

引言 在数字经济全球化发展的浪潮下,软件著作权已成为企业技术创新保护、市场竞争突围的核心要素,更是对接各类产业扶持政策的关键凭证。然而当前软著申请服务市场乱象频发,服务质量参差不齐,部分机构存在专业能力…

2025年比较好的金相分析厂家最新TOP实力排行

2025年比较好的金相分析厂家最新TOP实力排行行业背景与市场趋势金相分析作为材料科学研究和工业质量控制的关键环节,在金属加工、机械制造、航空航天、电子元器件等领域发挥着不可替代的作用。根据全球市场研究机构Ma…

UE4+C++构建-(五十三)UE4工程中引入第三方C++的.DLL第12篇-模块规则材料(.Build.cs)-第6篇-将第三方预编译库文件(.lib)添加到当前模块的公共链接库列表中

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 最新推荐智能分选设备厂家排行榜:覆盖 260 + 材质识别 国际测评认证 再生资源 / 固废处理优选绿色分拣中心/可回收物/生活垃圾塑料薄膜智能分选设备公司推荐

引言 全球资源循环利用行业正面临分选效率与纯度双重瓶颈,传统人工分拣模式已难以适配规模化、精细化处理需求,智能分选设备成为行业转型核心支撑。据国际再生资源回收协会(BIR)最新测评数据显示,优质智能分选设备…

linux c文件复制

在 Linux 中,复制 C 文件可以通过多种方式实现,以下是几种常见的方法:? 方法 1:使用 cp 命令 这是最简单直接的方式: cp source.c destination.csource.c:源文件路径 destination.c:目标文件路径(可以是相对路…

实现一种超轻量级的有线表格识别方法(有代码,可部署)

一.简介 在无意间看到一篇CBMS2021的一篇论文《NanoNet: Real-Time Polyp Segmentation in Video Capsule Endoscopy and Colonoscopy》, 该论文是专为视频胶囊内窥镜和结肠镜图像的息肉分割设计的架构,是一种医学图…

2025年质量好的贵金属电刷厂家选购指南与推荐

2025年质量好的贵金属电刷厂家选购指南与推荐行业背景与市场趋势贵金属电刷作为电气接触领域的关键部件,广泛应用于汽车、工业控制、航空航天、医疗设备等高精尖领域。随着全球工业4.0进程加速和新能源汽车市场爆发式…

深入解析:IT运维干货:lnav开源日志分析工具详解与CentOS实战部署

深入解析:IT运维干货:lnav开源日志分析工具详解与CentOS实战部署pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

渗透测试

渗透测试渗透测试与web漏洞的区别 内网IP和公网IP

2025年口碑好的油门踏板电刷优质厂家推荐榜单

2025年口碑好的油门踏板电刷优质厂家推荐榜单行业背景与市场趋势随着全球汽车产业向电动化、智能化方向快速发展,油门踏板电刷作为汽车电子控制系统中的关键部件,其市场需求呈现稳定增长态势。根据中国汽车工业协会最…

CF2097B Baggage Claim

显然只有走直线和拐弯两种情况。 对于第一种情况显然是固定的。 第二种情况可能能够取两个点,我们将其连边,现在相当于对每条边都要选出一个代表点,每条边的代表点不同,问你有多少种方案数,按照树,基环树,其他情…

2025 最新推荐!移动厕所源头厂家权威榜单:千台储备 + 全国网点,国际测评认证优选指南室外/临时/活动/简易/户外临时/工地临时/户外移动厕所出租公司推荐

引言 随着大型活动、工程建设、户外文旅等场景的需求爆发,移动厕所行业迎来发展热潮,但市场良莠不齐的问题依然突出。据国际环境卫生协会(IEHA)最新测评数据显示,仅 32% 的厂家设备储备量达标,45% 的品牌服务响应…

2025 最新推荐飞达剥标机优质厂家口碑榜:进口零件 + 全链条服务,前推式飞达剥标机/后撤式飞达剥标机/片料式飞达剥标机/飞达剥标机供料器公司推荐

在电子产品、汽车、电动车及光伏线缆等行业的规模化生产中,线材加工的效率与精度直接决定产能升级上限,飞达剥标机作为核心加工设备,其性能稳定性对产品合格率的影响占比高达 62%(数据源自国际机械自动化协会 2024…

【URP】Unity[RendererFeatures]贴花Decal

Unity URP中的Decal(贴花)系统是一种用于将材质投射到场景几何体表面的技术,主要用于实现血迹、弹孔、涂鸦等动态表面装饰效果。以下是详细解析: 核心功能与用途 ‌动态投影‌:通过Decal【从UnityURP开始探索游戏…

2025年评价高的编织纸绳热门厂家推荐榜单

2025年评价高的编织纸绳热门厂家推荐榜单 行业背景与市场趋势 随着全球环保意识的提升,纸绳作为传统塑料绳的绿色替代品,市场需求持续增长。根据《2024年全球纸制品市场分析报告》,纸绳市场规模预计在2025年达到2…

2025年口碑好的拉菲草纸绳TOP品牌厂家排行榜

2025年口碑好的拉菲草纸绳TOP品牌厂家排行榜行业背景与市场趋势随着全球环保意识的不断提升和可持续发展理念的深入人心,环保包装材料市场迎来了前所未有的发展机遇。据《2024-2029年全球环保包装材料市场分析报告》显…

信竞生家长必须要了解的几个网站

信竞生家长必须要了解的几个网站信竞生家长必须要了解的几个网站:https://www.noi.cn/,NOI 官网, 用于了解各省和全国的官方信竞政策、查询各种信息,包括所有选手的获奖信息。 https://oier.baoshuo.dev/,oierdb收录…

2025年口碑好的木螺丝最新TOP厂家排名

2025年口碑好的木螺丝最新TOP厂家排名行业背景与市场趋势随着全球建筑和家居装饰行业的持续发展,木螺丝作为基础紧固件市场需求稳步增长。据中国五金制品协会2024年数据显示,全球木螺丝市场规模已达到78亿美元,预计…