1. 程式人生 > >自定義Adapter實現多檢視Item的ListView

自定義Adapter實現多檢視Item的ListView

From http://www.devdiv.com/adapter_item_listview-article-3730-1.html

1、原理分析


        Adapter對於ListView是非常重要的,它處於listView和資料來源的中間,負責為ListView建立具體的檢視。之前提到過ListView採用了View複用技術,即使需要顯示大量的資料列表時它也能高效的工作,它總是試圖複用已經存在的View。

        下面就對View複用技術,做簡單的講解:

        簡單來說,假設一個ListView中存在7個Item,從上到下分別是Item1~Item7,當用戶向上滑動螢幕時,Item1會滾動到螢幕區域以外,item1並沒有被銷燬,而是被放入了回收站(Recycler)。當ListView需要顯示下一個item時,它會首先檢查回收站裡是否有可用的Item,剛好發現了item1,直接複用item1。ListView把獲取到的Item1和新的位置(position8)傳遞給Adapter的getView方法,在getView方法中根據position8從資料來源中取出對應的資料覆蓋到item1,這時item1就變成了item8。最後,ListView把新生成item8顯示到介面上。


        而當ListView中存在不同檢視的Item的時候,Adapter中存在一個int getViewTypeCount()方法返回item使用的View型別的數量(預設為1)。listView根據Adapter的這個方法的返回值,在回收站中建立對應數量的儲存區域。而Adapter的int getItemViewType(int position):根據position獲取對應item使用的View型別。 ListView會在回收站中根據型別建立不同的儲存區域,listView會在呼叫Adapter 的getView方法之前,根據position獲取正確型別的View進行復用。


        通過以上兩種方式,ListView實現了在單一Item檢視和多種Item檢視情況下,View的複用。

        在上一次“ListView繫結EmptyView”的講解中,進行了簡單的Adapter的自定義實現,今天我們來講解在ListView中顯示不同時檢視的Item。如果只顯示單一檢視的Item,只需要重寫BaseAdapter的以下四個方法:

        int getCount():返回資料來源中資料項的總數量

        Object getItem(int position):根據position從資料來源中獲取資料項

        long getItemId(int position): 根據position從資料來源中獲取資料項ID


        View getView(int position, View convertView, ViewGroup parent):根據position建立View,它是Adapter中最重要的方法,listView通過它建立View。

        這也是進行自定義Adapter時必須要重寫的方法。

        要想實現多檢視的Item的ListView,還需要重寫Adapter的以下幾個方法(不是必須要重寫的):

        int getViewTypeCount():返回item使用的View型別的數量,預設為1。

        int getItemViewType(int position):根據position獲取對應item使用的View型別。

        boolean isEnabled (int position):根據position設定對應的item是否可用,即是否能接收UI事件。

其中,getItemViewType和getViewTypeCount通常需要配對使用


  2、示例分析

        這次的Demo實現的效果是,根據單詞不同的首字母,在ListView中對字母進行分別顯示。其中,單詞的首字母作為各部分的分隔,使用不同於字母的顯示檢視。
        因此在Demo中需要兩種不同風格的檢視。分別為: first_letter_item.xml,程式碼如下:

[程式碼]xml程式碼:

1 <!--?xml version="1.0" encoding="utf-8"?-->
2 <linearlayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent" android:layout_height="fill_parent"android:orientation="vertical">
3
4 <textview android:id="@+id/firstletter" style="?android:attr/listSeparatorTextViewStyle" android:layout_width="fill_parent"android:layout_height="wrap_content" android:textcolor="@android:color/white"
5 </textview></linearlayout>

 word_item.xml,程式碼如下:

[程式碼]xml程式碼:

1 <!--?xml version="1.0" encoding="utf-8"?-->

相關推薦

定義Adapter實現檢視Item的ListView

From http://www.devdiv.com/adapter_item_listview-article-3730-1.html 1、原理分析         Adapter對於ListView是非常重要的,它處於listView和資料來源的中間,負責為L

AutoCompleteTextView與定義Adapter實現自動補全

AutoCompleteTextView繼承自TextView,是一種可以實現自動補全的功能的TextView。先看效果: 該功能在目前很常見,例如在使用者進行登入的時候或者註冊的時候都用到了這種功能,在Android中這樣的效果我們可以藉助AutoCo

定義Adapter實現RecyclerView的可展開二級列表expand效果

網上實現可展開效果的RecyclerView做法很多,但轉發黨太多,幾乎找不到比較符合效率的做法,其中坑也不少。 想著RecyclerView這麼強大,決定自己研究一個,並基於以下四個原則: 1、作為一個有強迫症的人,我只想僅用一個RecyclerView搞定這個效果,不想

Android中Spinner下拉列表(使用ArrayAdapter和定義Adapter實現

     今天學習了Spinner元件,使用Spinner相當於從下拉列表中選擇專案,下面演示一下Spinner的使用(分別使用ArrayAdapter和自定義Adapter實現) (一):使用Arr

定義ViewGroup實現個單頁面上下滑動效果

閱讀過自定義ViewGroup實現仿淘寶的商品詳情頁的童鞋,應該都瞭解了ViewGroup中onMeasure、onLayout、onTouchEvent等相關方法的使用。在介紹仿淘寶商品詳情頁時,我們提到過現在網上很多實現方法是使用ScrollView巢狀兩個

Android 定義View實現行RadioGroup單選(選)

我們都知道RadioGroup可以實現選擇框,但它有一個侷限性,由於它是繼承自LinearLayout的,所以只能有一個方向,橫向或者縱向; 好在我們可以自定義View來實現多行的一個RadioGroup(我把它命令為MultiLineRadioGroup); 在貼出程式碼

Django高階程式設計之定義Field實現語言

自定義資料庫欄位 擴充套件預設的models.CharField和models.TextField使之成為支援多語言的欄位。 可以輕鬆實現複用,無需配置多餘選項 from django.conf import settings from django.db import models from django.

Spring Boot入門系列(十七)整合Mybatis,建立定義mapper 實現表關聯查詢!

之前講了Springboot整合Mybatis,介紹瞭如何自動生成pojo實體類、mapper類和對應的mapper.xml 檔案,並實現最基本的增刪改查功能。mybatis 外掛自動生成的mapper 實現了大部分基本、通用的方法,如:insert、update、delete、select 等大概20個左右

如何使用定義模板實現個性化維分析

自定義表格樣式 多維分析展現報表時,潤乾報表提供了一套預設的表格樣式,統一的表格樣式可以使業務人員減少報表美化的工作量。然而預設的樣式不可能迎合所有使用者的審美,為此潤乾提供了自定義表格樣式的功能,供使用者實現個性化的需求,下面小編就來教你如何改變預設表格的樣式。 先來看下預設的表格樣式,下

Android UI 定義ListView 實現下拉重新整理 載入更

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

定義UITableView實現定義左滑刪除按鈕及按鈕,拖拽cell和表頭進行排序

本文介紹了能拖拽cell和表頭進行排序的自定義UITableView,並且能自定義左滑顯示的UIButton樣式。 先看左滑自定義按鈕效果圖  :     override func tableView(_ tableView: UITableView, editA

定義控制元件三部曲檢視篇(三)——瀑布流容器WaterFallLayout實現

前言:只要在前行,夢想就不再遙遠 系列文章: 前面兩節講解了有關ViewGroup的onMeasure、onLayout的知識,這節我們深入性地探討一下,如何實現經常見到的瀑布流容器,本節將實現的效果圖如下: 從效果圖中可以看出這裡要完成的

android 定義ImageView實現圖片手勢滑動,點觸控放大縮小效果

首先呢,還是一貫作風,我們先來看看眾多應用中的示例:(這種效果是很常見的,可以說應用的必須品.)                             搜狐客戶端                                    百度新聞客戶端          

定義SwipeRefreshLayout實現上拉載入更帶系統的下拉重新整理

/** * Created by lzy on 2017/6/6 0006. */ public class MySwipeRefreshLayout extends SwipeRefreshLayout{ private final TextView mFoo

微信小程式定義tab,層tab巢狀實現

小程式最近是越來越火了…… 做小程式有一段時間了,總結一下專案中遇到的問題及解決辦法吧。 專案中有個多 tab 巢狀的需求,進入程式主介面下面有兩個 tab,進入A模組後,A模組最底下又有多個tab,每個tab上又嵌了2-4個不等的tab。。。 這種變

ios執行緒操作(十二)—— 定義NSOperation實現網路下載後回撥

- (void)main { @autoreleasepool { // 下載圖片的耗時操作 NSURL *url = [NSURL URLWithString:self.urlString]; NSData *data = [NSDa

android 定義ImageView實現圖片手勢滑動 點觸控放大縮小效果

                轉自:http://blog.csdn.net/jj120522/article/details/8467810首先呢,還是一貫作風,我們先來看看眾多應用中的示例:(這種效果是很常見的,可以說應用的必須品.)                           搜狐客戶端  

定義RadioGroup實現radioButton

     前段時間我需要一個2行2列的單選組合按鈕,效果如下:但是發現在RadioGroup添加布局的時候就會失去radioButton的互斥行,我上網查了一下相關的自定義RadioGroup的方法,希望能夠找到能如意在裡面隨意佈局的,但是貌似沒有找到,好像都是根據各自的

研究MapReduce原始碼之實現定義LineRecordReader完成行讀取檔案內容

TextInputFormat是Hadoop預設的資料輸入格式,但是它只能一行一行的讀記錄,如果要讀取多行怎麼辦? 很簡單 自己寫一個輸入格式,然後寫一個對應的Recordreader就可以了,但是要實現確不是這麼簡單的 首先看看TextInputForma

Android 定義Adapter實現定義填充ListView的Item

1>實體類---即ListView中各個Item中填充的內容 package com.demo.cxc.compoundview.com.demo.cxc.entity; import java.text.SimpleDateFormat; import java.