国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Adapter實現ListView帶多選框等狀態的自定義控件的注意事項

Adapter實現ListView帶多選框等狀態的自定義控件的注意事項

2021-01-05 11:56Android開發網 Android

Android本身為ListView提供了幾個方便的Adapter,比如ArrayAdapter、SimpleCurrentAdapter等等,接下來介紹自定義Adapter實現ListView帶多選框等狀態控件的注意事項,感興趣的朋友可以詳細了解下,或許對你有所幫助

Android本身為ListView提供了幾個方便的Adapter,比如ArrayAdapter、SimpleCurrentAdapter等等。但是為了實現更復雜的列表視圖和控制,一般都要繼承BaseAdapter來實現自己的Adapter。

我需要的ListView是如圖一樣的實現SD卡資源文件瀏覽列表,每個列表項由一個ImageView、TextView、CheckBox組成,并且要求當整個列表中有一個或一個以上的Checkbox被選中時,右上角的搜索按鈕就顯示出來,否則就隱藏,因此需要對每個列表項的CheckBox設置監聽器。若使用Android提供的Adapter實現起來比較復雜,所以我選擇繼承BaseAdapter來實現自己的Adapter。

首先要知道的是ListView顯示原理。ListView接收了Adapter之后,ListView的列表項數據是來源于接收的Adapter的。當ListView要展現出來的時候,ListView就會調用Adapter的getCount方法來獲得一共需要繪制多少個列表項,之后就開始調用getView方法來獲得每個列表項的View進行裝載。也就是說ListView的列表項就是每次調用getView返回的View,每次調用getView獲得的列表項View是什么樣子,我們看到的這個列表項就是什么樣子。

我繼承BaseAdapter來實現自己的Adapter,至少需要重寫基本的getView、getCount、getItem、getItemID四個方法。其中getCount和getView的功能如上所述,所以我要想實現對每個列表項多選框按鈕的監聽就需要在getView中返回View給ListView之前,對View中的多選框設置監聽器。getView方法中帶三個參數public View getView(int position,View convertView,ViewGroup parent),一般都是將convertView最為返回的View。

在這里,需要插播說明一下Android系統對ListView的實現小細節。Android構造ListView列表項的時候每次只會構造足夠滿足屏幕顯示數量的列表項,一般都是10個左右。當ListView的列表項多于屏幕能夠顯示的列表項的時候,ListView就可以上下拉動,每次拉動顯示后續列表項時就會再次調用getView方法來構造后續列表項的View。如果ListView是首次顯示出來,那么getView的參數View convertView就是null空的;如果是拉動ListView調用的getView,那么這時getView的參數convertView就不再是null,而是隨著拉動剛剛被拉走隱藏掉的列表項的View。這么做的好處是可以節省資源。

基于這個細節,如果重寫getView方法時,要將參數convertView作為返回View,那么getView中就應該判斷convertView是否為null。為空的話就需要使用Inflater構造出來,不為空的話就可以直接使用了。我的需求中需要對多選框進行監聽,所以在返回convertView之前需要中convertView中獲取多選框控件并設置監聽器。

一開始,我以為這樣就能夠實現我的需求了,但是出來的結果卻意想不到。當我點擊一個多選框后,將列表往下拉,下面出來的沒有選中的列表框也變成選中的狀態。注意到我每次點擊一個多選框后往下拉同步被選中的多選框的距離都是不變的,總是相隔11項。于是,回想getView中convertView參數的特點,當我往下拉的時候,ListView調用getView方法中的convertView就是回收來的因為拉動被隱藏的View。在我這個例子中,由于多選框是一種帶有狀態標示的控件,我的getView沒有對其狀態進行重新設置,所以就造成了這種奇怪現象。我的解決方法是在我實現的Adapter類中創建一個boolean數組用于保存對應列表項多選框的狀態(getView中第一個參數position就是列表項ID,是根據數據來標識,不是根據列表項View來標識的,所以可以根據position來對列表項數據進行選中和非選中標識),每次調用getView都會在其中判斷position位置上的boolean值來決定多選框的狀態。

同樣的,基于這個原理,使用其它帶狀態的控件也需要注意getView回收的問題。當然,也可以不使用convertView最為getView的返回結果,而在getView每次調用都重新構造一個View,或者Adapter類中構造一個與數據數量等長的View數組。不過這么做的話就比較消耗資源。

另外,BaseAdapter中的getItem和getItemId方法再構造ListView構造過程中并沒有使用過,不過據說是在關于ListView的一些監聽器中會調用到,所以繼承BaseAdapter時最好也給這兩個方法返回一個有意義的值。getItemId一般返回對應的position,getItem返回對應position的列表數據對象。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产免费亚洲 | 国产在线精品一区二区三区 | 久久亚洲综合 | 一个色综合色 | 爱免费视频 | 久草.com | 羞羞网站| 成人国产电影 | 免费精品人在线二线三线区别 | 成a人片在线观看 | 国产精品亚洲视频 | 日韩欧一区二区三区 | 欧美视频免费在线 | 日韩色区 | 久久久久久久久久一区二区 | 久久精品2 | 毛片国产 | 国产综合在线观看视频 | 偷拍一区二区三区 | 亚洲一区二区av | 欧美片网站免费 | 日韩精品一区二区三区四区五区 | 欧美大片免费高清观看 | 亚洲精品一区 | 成人在线观看日韩 | 久久亚洲美女 | 亚洲一区二区三区四区的 | 午夜视频网站 | 天堂视频在线 | 成人免费小视频 | 久久综合九九 | 91精品久久久久 | 国产精品成人在线视频 | 成年人免费看 | 欧美日韩在线不卡 | 狠狠色狠狠色合久久伊人 | 在线观看国产成人av片 | 黄色在线免费看 | 天堂av一区二区 | 午夜精品久久久久久久久 | 欧美成人精品激情在线观看 |