對於安卓中的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,就可以解決問題。
最後祝大家中秋快樂!