文档章节

Android中ListView分类

短短的歼击机
 短短的歼击机
发布于 2013/01/30 15:31
字数 608
阅读 2548
收藏 18

1. 引言

 

    在Android开发过程中往往有这样的需求,将ListView中的内容按年,月,日进行分类显示,要实现这样的效果我们可能有很多种方法,

 

    如:多ListView拼合,自定义ListView组件等,下面介绍一种比较简单,而且实现结构清晰的实现方式,效果图及实现如下。

 

2. 效果图

    ListView分类

3. 功能实现

 (1) 主布局(main.xml)实现:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:orientation = "vertical"
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent"
    >
    <ListView
		android:id = "@+id/categoryList"
		android:layout_width = "fill_parent" 
		android:layout_height = "fill_parent"
		/>
</LinearLayout>&nbsp;
  (2) 主Activity实现:



package com.flora;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class ListViewCategoryActivity extends Activity {
	
	private String [] mContacts = {"马英才", "张三", "李四"};
	private String [] mMusic = {"素顔", "庐州月", "半城烟沙"};
	private String [] mEBook = {"拆掉思维里的墙", "淡定力", "人脉决定命脉"};
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mCategoryAdapter.addCategory("人名", new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mContacts));
		
		mCategoryAdapter.addCategory("音乐",new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMusic));
		
		mCategoryAdapter.addCategory("书籍",new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mEBook));
		
		ListView categoryList = (ListView) findViewById(R.id.categoryList);
		
		categoryList.setAdapter(mCategoryAdapter);
    }
    
    private CategoryAdapter mCategoryAdapter = new CategoryAdapter() {
		@Override
		protected View getTitleView(String title, int index, View convertView, ViewGroup parent) {
			TextView titleView;
			
			if (convertView == null) {
				titleView = (TextView)getLayoutInflater().inflate(R.layout.title, null);
			} else {
				titleView = (TextView)convertView;
			}
			
			titleView.setText(title);
			
			return titleView;
		}
	};
	
}
    (3) Adapter实现:



package com.flora;
import java.util.ArrayList;
import java.util.List;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
public abstract class CategoryAdapter extends BaseAdapter {
	private List<Category> categories = new ArrayList<Category>();
	
	public void addCategory(String title, Adapter adapter) {
		categories.add(new Category(title, adapter));
	}
	
	@Override
	public int getCount() {
		int total = 0;
		
		for (Category category : categories) {
			total += category.getAdapter().getCount() + 1;
		}
		
		return total;
	}
	@Override
	public Object getItem(int position) {
		for (Category category : categories) {
			if (position == 0) {
				return category;
			}
			
			int size = category.getAdapter().getCount() + 1;
			if (position < size) {
				return category.getAdapter().getItem(position-1);
			}
			position -= size;
		}
		
		return null;
	}
	@Override
	public long getItemId(int position) {
		return position;
	}
	
	public int getViewTypeCount() {
		int total = 1;
		
		for (Category category : categories) {
			total += category.getAdapter().getViewTypeCount();
		}
		
		return total;
	}
	public int getItemViewType(int position) {
		int typeOffset = 1;
		
		for (Category category : categories) {
			if (position == 0) {
				return 0;
			}
			
			int size = category.getAdapter().getCount() + 1;
			if (position < size) {
				return typeOffset + category.getAdapter().getItemViewType(position - 1);
			}
			position -= size;
			
			typeOffset += category.getAdapter().getViewTypeCount();
		}
		
		return -1;
	}
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		int categoryIndex = 0;
		
		for (Category category : categories) {
			if (position == 0) {
				return getTitleView(category.getTitle(), categoryIndex,convertView, parent);
			}
			int size = category.getAdapter().getCount()+1;
			if (position < size) {
				return category.getAdapter().getView(position - 1, convertView, parent);
			}
			position -= size;
			
			categoryIndex++;
		}
		
		return null;
	}
	
	protected abstract View getTitleView(String caption,int index,View convertView,ViewGroup parent);
	
}&nbsp;

   (4) 分类ValueBean实现:

package com.flora;
import android.widget.Adapter;
public class Category {
	private String mTitle;
	
	private Adapter mAdapter;
	public Category(String title, Adapter adapter) {
		mTitle = title;
		mAdapter = adapter;
	}
	
	public void setTile(String title) {
		mTitle = title;
	}
	
	public String getTitle() {
		return mTitle;
	}
	
	public void setAdapter(Adapter adapter) {
		mAdapter = adapter;
	}
	
	public Adapter getAdapter() {
		return mAdapter;
	}
	
}&nbsp;
  (5) 分类Title实现:

<?xml version="1.0" encoding="utf-8"?>
<TextView
	xmlns:android = "http://schemas.android.com/apk/res/android"
	android:layout_width = "match_parent"
	android:layout_height = "match_parent"
	android:minHeight = "30dip"
	android:gravity = "center_vertical"
	android:paddingLeft = "10dip"
	android:background = "@color/title_background_color"
	/>&nbsp;


© 著作权归作者所有

短短的歼击机

短短的歼击机

粉丝 82
博文 268
码字总数 269797
作品 0
武汉
高级程序员
私信 提问
加载中

评论(1)

马里士多德
LZ有Demo没,求Demo详阅
Android中ListView分类

引言 在Android开发过程中往往有这样的需求,将ListView中的内容按年,月,日进行分类显示,要实现这样的效果我们可能有很多种方法, 如:多ListView拼合,自定义ListView组件等,下面介绍一...

程序袁_绪龙
2015/11/19
145
0
为ListView增加Header (可动态修改其中的内容)

为ListView增加Header (可动态修改其中的内容) 博客分类: Android入门教程 Listview增加Header 为ListView增加Header (可动态修改其中的内容) 1.新建一个Layout: demolistitemheaderview.xm...

我是小强
2014/02/21
218
0
为什么listview绑定的数据为空

// 为点菜列表ListView绑定数据的方法 private void setMenusAdapter(){ lv = (ListView) findViewById(R.id.orderDetailListView01); // 获得EditText,CODE EditText code_et = (EditText......

sd_sd
2013/07/04
620
1
(GridView)ListView.setSelector(),ListView中Header/Footer的删除和添加/显示与隐藏

GridView.selector: GridView的设置根据Item选择状态改变背景状态 -- ListView.setSelector() 1.方法一:在listview中配置android:listSelector="@drawable/xxx" 或者在listview的item中添加......

desaco
01/21
0
0
Android ListView 滑动背景为黑色的解决办法 listview小知识整理

在别的地方看到的,转过来作为记录!! 在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备...

假装是大神
2012/12/20
553
0

没有更多内容

加载失败,请刷新页面

加载更多

全面兼容IE6/IE7/IE8/FF的CSS HACK写法

浏览器市场的混乱,给设计师造成很大的麻烦,设计的页面兼容完这个浏览器还得兼容那个浏览器,本来ie6跟ff之间的兼容是很容易解决的。加上个ie7会麻烦点,ie8的出现就更头疼了,原来hack ie...

前端老手
6分钟前
3
0
常用快递电子面单批量打印api接口对接demo-JAVA示例

目前有三种方式对接电子面单: 1.快递公司:各家快递公司逐一对接接口 2.菜鸟:支持常用15家快递电子面单打印 3.快递鸟:仅对接一次,支持常用30多家主流快递电子面单打印 目前也是支持批量打...

程序的小猿
9分钟前
5
0
Yii 框架中rule规则必须搭配验证函数才能使用

public $store_id;public $user_id;public $page;public $limit;public $list;public $mch_list;public $cart_id;public $is_community;public $shop_id;public $cart_typ......

chenhongjiang
12分钟前
2
0
Flutter使用Rammus实现阿里云推送

前言: 最近新的Flutter项目有“阿里云推送通知”的需求,就是Flutter的App启动后检测到有新的通知,点击通知栏然后跳转到指定的页面。在这里我使用的是第三方插件Rammus来实现通知的推送,之...

EmilyWu
12分钟前
26
0
Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

短网址顾名思义就是使用比较短的网址代替很长的网址。维基百科上面的解释是这样的: 短网址又称网址缩短、缩短网址、URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短...

阿里巴巴云原生
27分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部