安卓 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,就可以解決問題。

最後祝大家中秋快樂!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章