Android ListView分類/分組效果
實現ListView分類顯示效果,目前我知道的有兩種方案:
- 每一個ItemView都包含用於顯示分類資訊的view(TitleView)和用於顯示內容view(參考帶索引的listview)
- 通過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
android之Listview的分組實現
對於Listview的分組我們再熟悉不過了,因為Android自帶的通訊錄中的聯絡人資訊就是使用的ListView分組,最近專案中用到了這個功能。所以趁著週末有時間,也更新下一篇這樣的部落格,希望對大家能夠有幫助。 其實對於分組的Lis
android listview & toolbar形成的一種炫酷效果(外加一個圓形圖片的實現)
介面的效果用到的技術都很基本, 但實現的思路很新穎, 程式碼和佈局充滿各種技巧, 值得學習和借鑑. 效果圖: 原理圖: 佈局程式碼: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res