Adapter實現(xiàn)ListView帶多選框等狀態(tài)的自定義控件的注意事項
更新時間:2013年01月21日 14:43:17 作者:
Android本身為ListView提供了幾個方便的Adapter,比如ArrayAdapter、SimpleCurrentAdapter等等,接下來介紹自定義Adapter實現(xiàn)ListView帶多選框等狀態(tài)控件的注意事項,感興趣的朋友可以詳細了解下,或許對你有所幫助
Android本身為ListView提供了幾個方便的Adapter,比如ArrayAdapter、SimpleCurrentAdapter等等。但是為了實現(xiàn)更復雜的列表視圖和控制,一般都要繼承BaseAdapter來實現(xiàn)自己的Adapter。
我需要的ListView是如圖一樣的實現(xiàn)SD卡資源文件瀏覽列表,每個列表項由一個ImageView、TextView、CheckBox組成,并且要求當整個列表中有一個或一個以上的Checkbox被選中時,右上角的搜索按鈕就顯示出來,否則就隱藏,因此需要對每個列表項的CheckBox設置監(jiān)聽器。若使用Android提供的Adapter實現(xiàn)起來比較復雜,所以我選擇繼承BaseAdapter來實現(xiàn)自己的Adapter。
首先要知道的是ListView顯示原理。ListView接收了Adapter之后,ListView的列表項數(shù)據(jù)是來源于接收的Adapter的。當ListView要展現(xiàn)出來的時候,ListView就會調用Adapter的getCount方法來獲得一共需要繪制多少個列表項,之后就開始調用getView方法來獲得每個列表項的View進行裝載。也就是說ListView的列表項就是每次調用getView返回的View,每次調用getView獲得的列表項View是什么樣子,我們看到的這個列表項就是什么樣子。
我繼承BaseAdapter來實現(xiàn)自己的Adapter,至少需要重寫基本的getView、getCount、getItem、getItemID四個方法。其中getCount和getView的功能如上所述,所以我要想實現(xiàn)對每個列表項多選框按鈕的監(jiān)聽就需要在getView中返回View給ListView之前,對View中的多選框設置監(jiān)聽器。getView方法中帶三個參數(shù)public View getView(int position,View convertView,ViewGroup parent),一般都是將convertView最為返回的View。
在這里,需要插播說明一下Android系統(tǒng)對ListView的實現(xiàn)小細節(jié)。Android構造ListView列表項的時候每次只會構造足夠滿足屏幕顯示數(shù)量的列表項,一般都是10個左右。當ListView的列表項多于屏幕能夠顯示的列表項的時候,ListView就可以上下拉動,每次拉動顯示后續(xù)列表項時就會再次調用getView方法來構造后續(xù)列表項的View。如果ListView是首次顯示出來,那么getView的參數(shù)View convertView就是null空的;如果是拉動ListView調用的getView,那么這時getView的參數(shù)convertView就不再是null,而是隨著拉動剛剛被拉走隱藏掉的列表項的View。這么做的好處是可以節(jié)省資源。
基于這個細節(jié),如果重寫getView方法時,要將參數(shù)convertView作為返回View,那么getView中就應該判斷convertView是否為null。為空的話就需要使用Inflater構造出來,不為空的話就可以直接使用了。我的需求中需要對多選框進行監(jiān)聽,所以在返回convertView之前需要中convertView中獲取多選框控件并設置監(jiān)聽器。
一開始,我以為這樣就能夠實現(xiàn)我的需求了,但是出來的結果卻意想不到。當我點擊一個多選框后,將列表往下拉,下面出來的沒有選中的列表框也變成選中的狀態(tài)。注意到我每次點擊一個多選框后往下拉同步被選中的多選框的距離都是不變的,總是相隔11項。于是,回想getView中convertView參數(shù)的特點,當我往下拉的時候,ListView調用getView方法中的convertView就是回收來的因為拉動被隱藏的View。在我這個例子中,由于多選框是一種帶有狀態(tài)標示的控件,我的getView沒有對其狀態(tài)進行重新設置,所以就造成了這種奇怪現(xiàn)象。我的解決方法是在我實現(xiàn)的Adapter類中創(chuàng)建一個boolean數(shù)組用于保存對應列表項多選框的狀態(tài)(getView中第一個參數(shù)position就是列表項ID,是根據(jù)數(shù)據(jù)來標識,不是根據(jù)列表項View來標識的,所以可以根據(jù)position來對列表項數(shù)據(jù)進行選中和非選中標識),每次調用getView都會在其中判斷position位置上的boolean值來決定多選框的狀態(tài)。
同樣的,基于這個原理,使用其它帶狀態(tài)的控件也需要注意getView回收的問題。當然,也可以不使用convertView最為getView的返回結果,而在getView每次調用都重新構造一個View,或者Adapter類中構造一個與數(shù)據(jù)數(shù)量等長的View數(shù)組。不過這么做的話就比較消耗資源。
另外,BaseAdapter中的getItem和getItemId方法再構造ListView構造過程中并沒有使用過,不過據(jù)說是在關于ListView的一些監(jiān)聽器中會調用到,所以繼承BaseAdapter時最好也給這兩個方法返回一個有意義的值。getItemId一般返回對應的position,getItem返回對應position的列表數(shù)據(jù)對象。
我需要的ListView是如圖一樣的實現(xiàn)SD卡資源文件瀏覽列表,每個列表項由一個ImageView、TextView、CheckBox組成,并且要求當整個列表中有一個或一個以上的Checkbox被選中時,右上角的搜索按鈕就顯示出來,否則就隱藏,因此需要對每個列表項的CheckBox設置監(jiān)聽器。若使用Android提供的Adapter實現(xiàn)起來比較復雜,所以我選擇繼承BaseAdapter來實現(xiàn)自己的Adapter。
首先要知道的是ListView顯示原理。ListView接收了Adapter之后,ListView的列表項數(shù)據(jù)是來源于接收的Adapter的。當ListView要展現(xiàn)出來的時候,ListView就會調用Adapter的getCount方法來獲得一共需要繪制多少個列表項,之后就開始調用getView方法來獲得每個列表項的View進行裝載。也就是說ListView的列表項就是每次調用getView返回的View,每次調用getView獲得的列表項View是什么樣子,我們看到的這個列表項就是什么樣子。
我繼承BaseAdapter來實現(xiàn)自己的Adapter,至少需要重寫基本的getView、getCount、getItem、getItemID四個方法。其中getCount和getView的功能如上所述,所以我要想實現(xiàn)對每個列表項多選框按鈕的監(jiān)聽就需要在getView中返回View給ListView之前,對View中的多選框設置監(jiān)聽器。getView方法中帶三個參數(shù)public View getView(int position,View convertView,ViewGroup parent),一般都是將convertView最為返回的View。
在這里,需要插播說明一下Android系統(tǒng)對ListView的實現(xiàn)小細節(jié)。Android構造ListView列表項的時候每次只會構造足夠滿足屏幕顯示數(shù)量的列表項,一般都是10個左右。當ListView的列表項多于屏幕能夠顯示的列表項的時候,ListView就可以上下拉動,每次拉動顯示后續(xù)列表項時就會再次調用getView方法來構造后續(xù)列表項的View。如果ListView是首次顯示出來,那么getView的參數(shù)View convertView就是null空的;如果是拉動ListView調用的getView,那么這時getView的參數(shù)convertView就不再是null,而是隨著拉動剛剛被拉走隱藏掉的列表項的View。這么做的好處是可以節(jié)省資源。
基于這個細節(jié),如果重寫getView方法時,要將參數(shù)convertView作為返回View,那么getView中就應該判斷convertView是否為null。為空的話就需要使用Inflater構造出來,不為空的話就可以直接使用了。我的需求中需要對多選框進行監(jiān)聽,所以在返回convertView之前需要中convertView中獲取多選框控件并設置監(jiān)聽器。
一開始,我以為這樣就能夠實現(xiàn)我的需求了,但是出來的結果卻意想不到。當我點擊一個多選框后,將列表往下拉,下面出來的沒有選中的列表框也變成選中的狀態(tài)。注意到我每次點擊一個多選框后往下拉同步被選中的多選框的距離都是不變的,總是相隔11項。于是,回想getView中convertView參數(shù)的特點,當我往下拉的時候,ListView調用getView方法中的convertView就是回收來的因為拉動被隱藏的View。在我這個例子中,由于多選框是一種帶有狀態(tài)標示的控件,我的getView沒有對其狀態(tài)進行重新設置,所以就造成了這種奇怪現(xiàn)象。我的解決方法是在我實現(xiàn)的Adapter類中創(chuàng)建一個boolean數(shù)組用于保存對應列表項多選框的狀態(tài)(getView中第一個參數(shù)position就是列表項ID,是根據(jù)數(shù)據(jù)來標識,不是根據(jù)列表項View來標識的,所以可以根據(jù)position來對列表項數(shù)據(jù)進行選中和非選中標識),每次調用getView都會在其中判斷position位置上的boolean值來決定多選框的狀態(tài)。
同樣的,基于這個原理,使用其它帶狀態(tài)的控件也需要注意getView回收的問題。當然,也可以不使用convertView最為getView的返回結果,而在getView每次調用都重新構造一個View,或者Adapter類中構造一個與數(shù)據(jù)數(shù)量等長的View數(shù)組。不過這么做的話就比較消耗資源。
另外,BaseAdapter中的getItem和getItemId方法再構造ListView構造過程中并沒有使用過,不過據(jù)說是在關于ListView的一些監(jiān)聽器中會調用到,所以繼承BaseAdapter時最好也給這兩個方法返回一個有意義的值。getItemId一般返回對應的position,getItem返回對應position的列表數(shù)據(jù)對象。
您可能感興趣的文章:
- Android自定義Adapter的ListView的思路及代碼
- android開發(fā)中ListView與Adapter使用要點介紹
- ListView的Adapter使用 之 初學ArrayAdapter String
- ListView的Adapter使用(綁定數(shù)據(jù)) 之 自定義每一項的布局去綁定數(shù)據(jù)
- Android listview與adapter詳解及實例代碼
- Android開發(fā)中ListView自定義adapter的封裝
- 揭秘在ListView等AdapterView上動態(tài)添加刪除項的陷阱
- ListView Adapter優(yōu)化 實例
- Android ListView適配器(Adapter)優(yōu)化方法詳解
- Android ListView自定義Adapter實現(xiàn)仿QQ界面
相關文章
Android 實現(xiàn)仿網(wǎng)絡直播彈幕功能詳解及實例
這篇文章主要介紹了Android 實現(xiàn)仿網(wǎng)絡直播彈幕功能詳解的相關資料,并附實例代碼及實現(xiàn)效果圖,需要的朋友可以參考下2016-11-11
詳解Android10的分區(qū)存儲機制(Scoped Storage)適配教程
這篇文章主要介紹了詳解Android10的分區(qū)存儲機制(Scoped Storage)適配教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05
Android布局之GridLayout網(wǎng)格布局
網(wǎng)格布局標簽是GridLayout。這個布局是android4.0新增的布局。這個布局只有4.0之后的版本才能使用。本文給大家介紹Android布局之GridLayout網(wǎng)格布局相關知識,感興趣的朋友一起學習吧2015-12-12
Android使用ViewPager實現(xiàn)無限滑動效果
相信在大家開發(fā)Android的時候,我們常常用ViewPager來為自己的應用創(chuàng)建廣告條幅,并且常常會遇到ViewPager無限滑動這樣的需求。下面來一起看看吧。2016-09-09
android Gallery組件實現(xiàn)的iPhone圖片滑動效果實例
這篇文章主要介紹了android Gallery組件實現(xiàn)的iPhone圖片滑動效果實例,即相冊內的圖片實現(xiàn)可左右滑動的效果,需要的朋友可以參考下2014-07-07
Android學習之使用SharedPreferences存儲應用程序數(shù)據(jù)
這篇文章主要為大家詳細介紹了Android學習之使用SharedPreferences保存應用程序數(shù)據(jù)的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05

