1. 程式人生 > >Android ListView分類/分組效果

Android ListView分類/分組效果

實現ListView分類顯示效果,目前我知道的有兩種方案:

  1. 每一個ItemView都包含用於顯示分類資訊的view(TitleView)和用於顯示內容view(參考帶索引的listview)
  2. 通過ListView載入不同型別的Item實現。本文屬於這種實現方式

當前實現描述:

與自定義Adapter的ListVIew雷同,只是多使用兩個BaseAdapter API:

public int getItemViewType (int position)  

獲取通過getView為指定專案建立的檢視的型別。  
引數  
    position 在adapter資料裡我們想知道檢視型別的專案的位置  
返回值  
    一個整形的檢視型別的描述。如果一個檢視通過getView
(int, View, ViewGroup)方法轉換成另一個檢視,則兩個檢視將共享同一型別。注意:整形必須在0和getViewTypeCount()– 1之間。IGNORE_ITEM_VIEW_TYPE也可以返回。 public int getViewTypeCount () 返回通過getView(int, View, ViewGroup))建立的檢視的型別數量。每一個型別表示一組通過getView(int, View, ViewGroup)方法轉換過的檢視。如果adapter針對所有專案返回相同的檢視型別,這個方法返回1。這個方法僅僅當adapter設定在AdapterView時呼叫。 返回值 通過這個adapter建立的檢視型別的數量

檢視 – 在Adapter.getView中通過getItemViewType獲取item型別,當前實現為分類item與普通item兩種,根據型別建立不同的VIew物件
資料 – 分類的資料通過List包含自定義資料物件Category,Category內部包含List用於儲存當前Category item資料。
覆寫BaseAdapter.areAllItemsEnabled 和 BaseAdapter.isEnabled兩個方法,確保分類Item不可點選

程式碼:

Activity:

public class MainActivity extends Activity
{
private CategoryAdapter mCustomBaseAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ListView listView = (ListView) findViewById(R.id.listView1); // 資料 ArrayList<Category> listData = getData(); mCustomBaseAdapter = new CategoryAdapter(getBaseContext(), listData); // 介面卡與ListView繫結 listView.setAdapter(mCustomBaseAdapter); listView.setOnItemClickListener(new ItemClickListener()); } private class ItemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getBaseContext(), (String)mCustomBaseAdapter.getItem(position), Toast.LENGTH_SHORT).show(); } } /** * 建立測試資料 */ private ArrayList<Category> getData() { ArrayList<Category> listData = new ArrayList<Category>(); Category categoryOne = new Category("路人甲"); categoryOne.addItem("馬三立"); categoryOne.addItem("趙本山"); categoryOne.addItem("郭德綱"); categoryOne.addItem("周立波"); Category categoryTwo = new Category("事件乙"); categoryTwo.addItem("**貪汙"); categoryTwo.addItem("**照門"); Category categoryThree = new Category("書籍丙"); categoryThree.addItem("10天學會***"); categoryThree.addItem("**大全"); categoryThree.addItem("**祕籍"); categoryThree.addItem("**寶典"); categoryThree.addItem("10天學會***"); categoryThree.addItem("10天學會***"); categoryThree.addItem("10天學會***"); categoryThree.addItem("10天學會***"); Category categoryFour = new Category("書籍丙"); categoryFour.addItem("河南"); categoryFour.addItem("天津"); categoryFour.addItem("北京"); categoryFour.addItem("上海"); categoryFour.addItem("廣州"); categoryFour.addItem("湖北"); categoryFour.addItem("重慶"); categoryFour.addItem("山東"); categoryFour.addItem("陝西"); listData.add(categoryOne); listData.add(categoryTwo); listData.add(categoryThree); listData.add(categoryFour); return listData; } }

Adapter:

public class CategoryAdapter extends BaseAdapter {  

    private static final int TYPE_CATEGORY_ITEM = 0;  
    private static final int TYPE_ITEM = 1;  

    private ArrayList<Category> mListData;  
    private LayoutInflater mInflater;  


    public CategoryAdapter(Context context, ArrayList<Category> pData) {  
        mListData = pData;  
        mInflater = LayoutInflater.from(context);  
    }  

    @Override  
    public int getCount() {  
        int count = 0;  

        if (null != mListData) {  
            //  所有分類中item的總和是ListVIew  Item的總個數  
            for (Category category : mListData) {  
                count += category.getItemCount();  
            }  
        }  

        return count;  
    }  

    @Override  
    public Object getItem(int position) {  

        // 異常情況處理  
        if (null == mListData || position <  0|| position > getCount()) {  
            return null;   
        }  

        // 同一分類內,第一個元素的索引值  
        int categroyFirstIndex = 0;  

        for (Category category : mListData) {  
            int size = category.getItemCount();  
            // 在當前分類中的索引值  
            int categoryIndex = position - categroyFirstIndex;  
            // item在當前分類內  
            if (categoryIndex < size) {  
                return  category.getItem( categoryIndex );  
            }  

            // 索引移動到當前分類結尾,即下一個分類第一個元素索引  
            categroyFirstIndex += size;  
        }  

        return null;  
    }  

    @Override  
    public int getItemViewType(int position) {  
        // 異常情況處理  
        if (null == mListData || position <  0|| position > getCount()) {  
            return TYPE_ITEM;   
        }  


        int categroyFirstIndex = 0;  

        for (Category category : mListData) {  
            int size = category.getItemCount();  
            // 在當前分類中的索引值  
            int categoryIndex = position - categroyFirstIndex;  
            if (categoryIndex == 0) {  
                return TYPE_CATEGORY_ITEM;  
            }  

            categroyFirstIndex += size;  
        }  

        return TYPE_ITEM;  
    }  

    @Override  
    public int getViewTypeCount() {  
        return 2;  
    }  

    @Override  
    public long getItemId(int position) {  
        return position;  
    }  

    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  

        int itemViewType = getItemViewType(position);  
        switch (itemViewType) {  
        case TYPE_CATEGORY_ITEM:  
            if (null == convertView) {  
                convertView = mInflater.inflate(R.layout.listview_item_header, null);  
            }  

            TextView textView = (TextView) convertView.findViewById(R.id.header);  
            String  itemValue = (String) getItem(position);  
            textView.setText( itemValue );  
            break;  

        case TYPE_ITEM:  
            ViewHolder viewHolder = null;  
            if (null == convertView) {  

                convertView = mInflater.inflate(R.layout.listview_item, null);  

                viewHolder = new ViewHolder();  
                viewHolder.content = (TextView) convertView.findViewById(R.id.content);  
                viewHolder.contentIcon = (ImageView) convertView.findViewById(R.id.content_icon);  
                convertView.setTag(viewHolder);  
            } else {  
                viewHolder = (ViewHolder) convertView.getTag();  
            }  

             // 繫結資料  
            viewHolder.content.setText( (String)getItem(position) );  
            viewHolder.contentIcon.setImageResource(R.drawable.ic_launcher);  
            break;  
        }  

        return convertView;  
    }  


    @Override  
    public boolean areAllItemsEnabled() {  
        return false;  
    }  

    @Override  
    public boolean isEnabled(int position) {  
        return getItemViewType(position) != TYPE_CATEGORY_ITEM;  
    }  


    private class ViewHolder {  
        TextView content;  
        ImageView contentIcon;  
    }  

}  

資料物件

public class Category {  

    private String mCategoryName;  
    private List<String> mCategoryItem = new ArrayList<String>();  

    public Category(String mCategroyName) {  
        mCategoryName = mCategroyName;  
    }  

    public String getmCategoryName() {  
        return mCategoryName;  
    }  

    public void addItem(String pItemName) {  
        mCategoryItem.add(pItemName);  
    }  

    /** 
     *  獲取Item內容 
     *  
     * @param pPosition 
     * @return 
     */  
    public String getItem(int pPosition) {  
        // Category排在第一位  
        if (pPosition == 0) {  
            return mCategoryName;  
        } else {  
            return mCategoryItem.get(pPosition - 1);  
        }  
    }  

    /** 
     * 當前類別Item總數。Category也需要佔用一個Item 
     * @return  
     */  
    public int getItemCount() {  
        return mCategoryItem.size() + 1;  
    }  

}  

相關推薦

Android ListView分類/分組效果

實現ListView分類顯示效果,目前我知道的有兩種方案: 每一個ItemView都包含用於顯示分類資訊的view(TitleView)和用於顯示內容view(參考帶索引的listview) 通過ListView載入不同型別的Item實現。本文屬於這種實現方

Android listview 取消選中效果

場景: Android listview系統自帶了點選item效果,如果item是圓角背景樣式的時候,會發現點選item時,預設點選效果是方形的,這樣很不好看。那麼怎麼取消選中效果呢? 解決: 在

Android ListView 側滑效果實現(滑動展開、滑動刪除)

轉載請註明出處:http://blog.csdn.net/lonelyroamer/article/details/42439875 專案需要ListView滑動刪除的效果,首先肯定是拿來主義,在網上搜了一遍,發現這樣的東西真不少,比較有名的Github上的SwipeLi

Android listview實現分組

  對於Listview的分組我們再熟悉不過了,因為Android自帶的通訊錄中的聯絡人資訊就是使用的ListView分組,最近專案中用到了這個功能。所以趁著週末有時間,也更新下一篇這樣的部落格,希望對大家能夠有幫助。        其實對於分組的ListView和我們平時

Android 實現ListView不可滾動效果

    希望得到的效果是ListView不能滾動,但是最大的問題在與ListView Item還必有點選事件,如果不需要點選事件那就簡單了,直接設定ListView.setEnable(false);     如果還需要點選事件,滾動與點選都是在ListView Touc

Android ListView怎麼取消item的點選效果

問題:           有時候我們的Listview只是用來顯示資料,展示資料。並不需要有item的點選事件。可是發現不寫item的點選事件,點選介面item會發現有點選的效果,給使用者一種錯覺,

Android 簡單實現ListView頂部懸浮效果

首先上效果圖,實現如下效果:起初在網上搜了下實現這樣的效果,美團網,大眾點評的“購買框”懸浮效果也是這樣的,不過作者實現比較麻煩,自己想了想就根據ListView提供的一些特性進行了簡單實現。整個主要佈局就是一個ListView,如果listview的上面有內容且高度比較高,可以把它當做listview的he

Android--ListView中item中實現跑馬燈效果

1.要實現跑馬燈的TextView寫法 <TextView android:layout_width="wrap_content"

Android 橫向帶有吸附效果的橫向拖動控制元件(效果同縱向下拉重新整理ListView)

先上一張效果圖 中間的橫向拖動就是我們要做的效果。 一、實現思路 仔細觀察不難發現,該拖動view與listview的下拉重新整理的效果很類似,手指拖動的時候顯示隱藏的view,手指放開自動回彈。只不過區別就是一個橫向一個縱向 下拉重新整理的實現思路如下: 自定義一個佈

Android ListView城市列表,按a-z分組字母索引排序

       在上一篇中實現了,先自定義資料來源,使Adapter通過實現SectionIndexer介面給ListView分組,並用Collections.sort對資料list進行排序。 但是Collections.sort並不高效,如果資料來源太多,必然會太耗時,

Android ListView怎麼取消點選效果

這兩天在搞個專案,想當苦逼,最後還是翻看Blog給解決了,就是用LIstView呈現的資料,類似於靜態的那中,但是不要點選效果,預設的就是點選一下顯示成橙黃色,先貼正確的解決方法,在ListView佈局中加上 android:listSelector="@android

android ListView 仿IOS 回彈效果

最近看IOS的下拉效果感覺很不錯,當拉倒最上面和最下面的時候繼續拉動會有緩衝,想在android裡面也做一個,到網上到處找,沒有找到好的方法,據說android新的API對ListView有這樣的支援,感覺不是特別好用。 自己利用scroller實現了一下,廢話不多說了直接

新手自定義控制元件,建立屬於自己的下拉重新整理(一)---Android,ListView實現IOS的彈性效果

前言 相信很多童鞋對於控制元件的下拉重新整理都比較熟悉吧,常用的PullToRefresh開源庫和Google自帶的SwipeRefreshLayout大家肯定也很熟悉吧,但作為一個Android開發新手,對於自定義控制元件和自定義View來實現一些效果肯定還

Android ListView側滑item,仿QQ刪除效果

最近的專案需求有一條是要實現仿QQ的側滑刪除效果,網上搜到了很多,但是與預想的都不太一樣,於是自己研究了一下,寫了一個Demo,記錄下來。 功能: 1.實現了仿QQ的Item側滑效果 2.可根據item的長度計算側滑範圍 3.實現item條目點選監聽與刪除按鈕監聽 4.

Android 實現ListView的彈性效果

     關於在Android中實現ListView的彈性效果,有很多不同的方法,網上一搜,也有很多,下面貼出在專案中經常用到的兩種實現ListView彈性效果的方法(基本上拿來就可以用),供大家參考:      第一種比較簡單,好容易理解,只是動態改變了ListView在

Android ListView的子項的隨意拖動效果

自定義ListView: package com.miao.listview; import android.content.Context; import android.content.res.TypedArray; import android.graphics.

Android 仿QQ分組管理可拖動Item的ListView(附原始碼)

趁著週一休息,更新一下部落格。最近專案中使用到了分組管理,需要實現Listview的Item拖動處理。查略一下資料和借鑑了別人的程式碼將功能實現了。現在整理一下程式碼,方便自己以後學習具體思路如下 重寫ListView的onInterceptTouchEvent方法進行控制

Android分類ListView

【宣告】此文出自指尖飛落的部落格:http://blog.csdn.net/huntersnail ——每天寫一篇部落格,每天做一點技術積累! 最近在專案版本迭代中需要用到分類的ListView,小區下面的N條收貨地址(類似聯絡人)。以前都是用的很普通的ListVie

androidListview分組實現

            對於Listview的分組我們再熟悉不過了,因為Android自帶的通訊錄中的聯絡人資訊就是使用的ListView分組,最近專案中用到了這個功能。所以趁著週末有時間,也更新下一篇這樣的部落格,希望對大家能夠有幫助。        其實對於分組的Lis

android listview & toolbar形成的一種炫酷效果(外加一個圓形圖片的實現)

介面的效果用到的技術都很基本, 但實現的思路很新穎, 程式碼和佈局充滿各種技巧, 值得學習和借鑑. 效果圖: 原理圖: 佈局程式碼: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res