对于安卓中的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);我设置断点分析了一下原因,最终发现原因是初始化自定义BaseAdapter并绑定到ListView是一个异步的过程,也就是说当主线程运行到“
listView.setAdapter(adapter);
View view=listView.getChildAt(0);
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() {因为BaseAdapter中getView()方法会被多次调用,而我们只需要获取到一次不为NULL的子view集合,所以只需定义一个标示,获取子View时判断是否为NULL,就可以解决问题。
@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;
}
}
});
最后祝大家中秋快乐!