安卓 Activity中获取ListView子View中控件

对于安卓中的ListView控件,相信大家都是又恨又爱。爱的是ListView展示数据极为美观方便,却又恨它的难以操控。我在最近的项目开发中,就遇到了让人头疼的问题——在Activity中获取ListView子View中控件。

众所周知,ListView是多项View的集合,ListView的每一项都是一个单独的View,只要获取到这个View,就能通过View.findViewById(int id)方法获取到对应控件,ListView本身为我们提供了一个方法getChildAt(int index)用于获取指定位置的子View。但在实际使用中,我们却会发现这个方法获取到的结果是NULL

FoodModifyAdapter adapter=new FoodModifyAdapter(FoodModifyActivity.this, keyValues);
listView.setAdapter(adapter);
View view=listView.getChildAt(0);
我设置断点分析了一下原因,最终发现原因是初始化自定义BaseAdapter并绑定到ListView是一个异步的过程,也就是说当主线程运行到“
View view=listView.getChildAt(0);
”这一句时,ListView子View尚未生成,自然获取到的结果为NULL。找到问题所在,下面我就来介绍解决这个问题的方法。

因为ListView的子View是在BaseAdapter的getView(int position, View arg1, ViewGroup arg2)方法中生成,所以当子View加载到最后一项时,getView(int position, View arg1, ViewGroup arg2)中position位置为传入List<T>数据行数-1,我们可以在此处设置监听(不会自定义监听的朋友可以自己去百度如何自定义监听,Activity中监听到控件加载完成,执行监听的的代码 获取子View集合

adapter.setOnViewCompleteListener(new OnViewCompleteListener() {
			
			@Override
			public void onViewComplete() {
				// TODO Auto-generated method stub
				if(!flag){
					views=new ArrayList<View>();
					for(int i=0;i<4;i++){
						View view=listView.getChildAt(i);
						if(view==null){
							return;
						}
						views.add(view);
					}
					flag=true;
				}
			}
		});
因为BaseAdapter中getView()方法会被多次调用,而我们只需要获取到一次不为NULL的子view集合,所以只需定义一个标示,获取子View时判断是否为NULL,就可以解决问题。

最后祝大家中秋快乐!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值