文档章节

Android中ListView分类

程序袁_绪龙
 程序袁_绪龙
发布于 2015/11/19 19:07
字数 619
阅读 148
收藏 3

1. 引言

 

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

 

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

 

2. 效果图

    ListView分类

3. 功能实现

 

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

[java] view plaincopy

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

  2. <LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"  

  3.     android:orientation = "vertical"  

  4.     android:layout_width = "fill_parent"  

  5.     android:layout_height = "fill_parent"  

  6.     >  

  7.     <ListView  

  8.         android:id = "@+id/categoryList"  

  9.         android:layout_width = "fill_parent"   

  10.         android:layout_height = "fill_parent"  

  11.         />  

  12. </LinearLayout>   

 

    (2) 主Activity实现:

[java] view plaincopy

  1. package com.flora;  

  2. import android.app.Activity;  

  3. import android.os.Bundle;  

  4. import android.view.View;  

  5. import android.view.ViewGroup;  

  6. import android.widget.ArrayAdapter;  

  7. import android.widget.ListView;  

  8. import android.widget.TextView;  

  9. public class ListViewCategoryActivity extends Activity {  

  10.       

  11.     private String [] mContacts = {"马英才""张三""李四"};  

  12.     private String [] mMusic = {"素顔""庐州月""半城烟沙"};  

  13.     private String [] mEBook = {"拆掉思维里的墙""淡定力""人脉决定命脉"};  

  14.       

  15.     @Override  

  16.     public void onCreate(Bundle savedInstanceState) {  

  17.         super.onCreate(savedInstanceState);  

  18.         setContentView(R.layout.main);  

  19.           

  20.         mCategoryAdapter.addCategory("人名"new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mContacts));  

  21.           

  22.         mCategoryAdapter.addCategory("音乐",new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMusic));  

  23.           

  24.         mCategoryAdapter.addCategory("书籍",new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mEBook));  

  25.           

  26.         ListView categoryList = (ListView) findViewById(R.id.categoryList);  

  27.           

  28.         categoryList.setAdapter(mCategoryAdapter);  

  29.     }  

  30.       

  31.     private CategoryAdapter mCategoryAdapter = new CategoryAdapter() {  

  32.         @Override  

  33.         protected View getTitleView(String title, int index, View convertView, ViewGroup parent) {  

  34.             TextView titleView;  

  35.               

  36.             if (convertView == null) {  

  37.                 titleView = (TextView)getLayoutInflater().inflate(R.layout.title, null);  

  38.             } else {  

  39.                 titleView = (TextView)convertView;  

  40.             }  

  41.               

  42.             titleView.setText(title);  

  43.               

  44.             return titleView;  

  45.         }  

  46.     };  

  47.       

  48. }  

 

    (3) Adapter实现:

[java] view plaincopy

  1. package com.flora;  

  2. import java.util.ArrayList;  

  3. import java.util.List;  

  4. import android.view.View;  

  5. import android.view.ViewGroup;  

  6. import android.widget.Adapter;  

  7. import android.widget.BaseAdapter;  

  8. public abstract class CategoryAdapter extends BaseAdapter {  

  9.     private List<Category> categories = new ArrayList<Category>();  

  10.       

  11.     public void addCategory(String title, Adapter adapter) {  

  12.         categories.add(new Category(title, adapter));  

  13.     }  

  14.       

  15.     @Override  

  16.     public int getCount() {  

  17.         int total = 0;  

  18.           

  19.         for (Category category : categories) {  

  20.             total += category.getAdapter().getCount() + 1;  

  21.         }  

  22.           

  23.         return total;  

  24.     }  

  25.     @Override  

  26.     public Object getItem(int position) {  

  27.         for (Category category : categories) {  

  28.             if (position == 0) {  

  29.                 return category;  

  30.             }  

  31.               

  32.             int size = category.getAdapter().getCount() + 1;  

  33.             if (position < size) {  

  34.                 return category.getAdapter().getItem(position-1);  

  35.             }  

  36.             position -= size;  

  37.         }  

  38.           

  39.         return null;  

  40.     }  

  41.     @Override  

  42.     public long getItemId(int position) {  

  43.         return position;  

  44.     }  

  45.       

  46.     public int getViewTypeCount() {  

  47.         int total = 1;  

  48.           

  49.         for (Category category : categories) {  

  50.             total += category.getAdapter().getViewTypeCount();  

  51.         }  

  52.           

  53.         return total;  

  54.     }  

  55.     public int getItemViewType(int position) {  

  56.         int typeOffset = 1;  

  57.           

  58.         for (Category category : categories) {  

  59.             if (position == 0) {  

  60.                 return 0;  

  61.             }  

  62.               

  63.             int size = category.getAdapter().getCount() + 1;  

  64.             if (position < size) {  

  65.                 return typeOffset + category.getAdapter().getItemViewType(position - 1);  

  66.             }  

  67.             position -= size;  

  68.               

  69.             typeOffset += category.getAdapter().getViewTypeCount();  

  70.         }  

  71.           

  72.         return -1;  

  73.     }  

  74.     @Override  

  75.     public View getView(int position, View convertView, ViewGroup parent) {  

  76.         int categoryIndex = 0;  

  77.           

  78.         for (Category category : categories) {  

  79.             if (position == 0) {  

  80.                 return getTitleView(category.getTitle(), categoryIndex,convertView, parent);  

  81.             }  

  82.             int size = category.getAdapter().getCount()+1;  

  83.             if (position < size) {  

  84.                 return category.getAdapter().getView(position - 1, convertView, parent);  

  85.             }  

  86.             position -= size;  

  87.               

  88.             categoryIndex++;  

  89.         }  

  90.           

  91.         return null;  

  92.     }  

  93.       

  94.     protected abstract View getTitleView(String caption,int index,View convertView,ViewGroup parent);  

  95.       

  96. }   

 

    (4) 分类ValueBean实现:

[java] view plaincopy

  1. package com.flora;  

  2. import android.widget.Adapter;  

  3. public class Category {  

  4.     private String mTitle;  

  5.       

  6.     private Adapter mAdapter;  

  7.     public Category(String title, Adapter adapter) {  

  8.         mTitle = title;  

  9.         mAdapter = adapter;  

  10.     }  

  11.       

  12.     public void setTile(String title) {  

  13.         mTitle = title;  

  14.     }  

  15.       

  16.     public String getTitle() {  

  17.         return mTitle;  

  18.     }  

  19.       

  20.     public void setAdapter(Adapter adapter) {  

  21.         mAdapter = adapter;  

  22.     }  

  23.       

  24.     public Adapter getAdapter() {  

  25.         return mAdapter;  

  26.     }  

  27.       

  28. }   

 

    (5) 分类Title实现:

[java] view plaincopy

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

  2. <TextView  

  3.     xmlns:android = "http://schemas.android.com/apk/res/android"  

  4.     android:layout_width = "match_parent"  

  5.     android:layout_height = "match_parent"  

  6.     android:minHeight = "30dip"  

  7.     android:gravity = "center_vertical"  

  8.     android:paddingLeft = "10dip"  

  9.     android:background = "@color/title_background_color"  

  10.     />   


本文转载自:http://blog.csdn.net/mayingcai1987/article/details/6367421

程序袁_绪龙
粉丝 106
博文 242
码字总数 66750
作品 0
普陀
程序员
私信 提问
Android中ListView分类

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

postdep
2013/01/30
2.5K
1
为ListView增加Header (可动态修改其中的内容)

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

我是小强
2014/02/21
219
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

没有更多内容

加载失败,请刷新页面

加载更多

006-Sigle-基于blockstack去中心化博客

本篇文章主要讲解有关基于Blockstack的Sigle是一个去中心化的博客项目; 官网地址:https://www.sigle.io/ Github地址:https://github.com/pradel/sigle 页面展示: 介绍: A beautiful de...

Riverzhou
21分钟前
9
0
驰骋工作流引擎开发平台属性功能的隐藏显示介绍

关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明 工作流设计 工作流快速开发平台 业务流程管理 bpm工作流系统 java工作流主流框架 自定义...

孟娟
23分钟前
8
0
MyBatis binding 模块分析

MyBatis binding 模块分析 binding功能代码所在包 org.apache.ibatis.binding binding模块作用 封装ibatis编程模型 ibatis编程模型中,SqlSession作为sql执行的入口,实用方法为sqlSession.se...

红妍落日
25分钟前
7
0
网易互娱的数据库选型和 TiDB 应用实践

作者介绍:李文杰,网易互娱计费组,高级数据库管理工程师,TiDB User Group Ambassador。 一、业务架构简介 计费组是为网易互娱产品提供统一登录和支付高效解决方案的公共支持部门,对内是互...

TiDB
31分钟前
8
0
Debezium接入Mysql遇到到的Tinyint坑

问题背景: 在Debezium做数据初始化的时候,对于一些tinyint字段的值,出现0,1的值的异常。 经过源码排查,数据在JDBC上面,读取到的数据是Boolean值。 通过排查,原来是MYSQL特有的数据问题...

吐槽的达达仔
40分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部