`

ListView分类展示

 
阅读更多

转载:http://blog.csdn.net/z_guijin/article/details/6630620

 

. 引言

 

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

 

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

 

2. 效果图

 

 

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>   

(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);  
      
} 

  (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;  
    }  
      
} 

 (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"  
        />   

 

分享到:
评论

相关推荐

    ListView分组显示

    这种效果通常涉及到对数据的分类和自定义适配器的使用,以便在ListView中创建可折叠和展开的分组。 首先,我们要理解ListView的工作原理。ListView通过Adapter来获取数据并将其转化为视图(View)显示在界面上。...

    listview分类显示

    "listview分类显示"这个主题,主要探讨的是如何在ListView中实现数据的分组和分类展示。 首先,我们需要理解ListView的基本结构。ListView由多个ListView项(ListView Item)组成,每个项通常对应数据集中的一个...

    大众点评分类双Listview展示

    在Android开发中,"大众点评分类双Listview展示"是一个常见的设计模式,它主要用于呈现具有层次结构的数据。这种设计能够使用户更容易地浏览和理解大量的信息,尤其在餐饮、旅游等场景下,用户通常需要根据不同的...

    ListView 列表展示、分组、国家图标展示.rar

    在Windows桌面应用开发中,`ListView`控件是常用的一种数据展示组件,它允许开发者以列表形式展示数据,包括各种视图(如大图标、小图标、列表、详细信息等)。在这个项目中,"ListView 列表展示、分组、国家图标...

    Android ListView分类实现 - 第二种实现方式

    实现ListView分类的关键在于重写Adapter的以下方法: 1. `getItemViewType(int position)`:此方法返回给定位置的列表项的类型标识。根据数据源中的数据类型,我们可以返回不同的整数值,表示不同类型的视图。 2. ...

    Android ListView数据分类显示

    在Android开发中,ListView是一种常用的UI组件,用于展示大量数据列表。它允许用户滚动查看多个条目,并且可以通过适配器(Adapter)进行数据绑定。然而,当数据需要按照特定类别或分组显示时,单纯的ListView可能...

    android listview+fragment实现仿京东分类

    在这个"android listview+fragment实现仿京东分类"项目中,我们将探讨如何利用这两种组件来模仿京东应用中的商品分类功能。以下是相关知识点的详细说明: 1. **ListView**: ListView是Android SDK提供的一种视图...

    Android ListView分类例子

    在Android开发中,ListView是用于显示大量数据列表的一个核心组件,尤其适用于展示具有多项条目的数据集合。...学习这个例子有助于开发者更好地理解和应用ListView分类,提高用户体验,特别是在展示大量结构化数据时。

    android 二级分类列表 listview

    在Android开发中,二级分类列表通常用于展示具有层次结构的数据,比如应用商店的分类、论坛板块等。在本场景中,我们关注的是如何实现一个基于ListView的二级分类列表。ListView作为Android中的一个基础组件,是展示...

    android仿美团listview

    当用户在左侧的ListView中选择不同的分类时,右侧的ListView会实时更新,展示对应分类下的商品。 3. **监听事件**: 实现联动的关键在于监听ListView的点击事件。我们可以为ListView的每个条目设置OnClickListener...

    安卓listview相关相关-一个ExpandableListView的例子实现多级菜单分类展示.rar

    这个压缩包提供的就是一个ExpandableListView的实例,帮助开发者理解和实践如何在Android应用中实现多级菜单的分类展示。 首先,我们要理解ExpandableListView的基本概念。它扩展了ListView的功能,允许每个列表项...

    android listview分类

    本教程将深入讲解如何实现一个简单的ListView分类,帮助开发者更好地理解和运用这一功能。 一、ListView概述 ListView是Android SDK中的一个视图组件,主要用于显示一列可滚动的项目列表。每个列表项可以通过自定义...

    listView 嵌套 ListView demo

    然而,有时我们可能需要构建更复杂的界面,比如包含多级分类的数据结构,这时就需要用到ListView的嵌套。"ListView 嵌套 ListView demo"就是一个示例,展示了如何在主ListView中嵌入子ListView来实现二级列表的效果...

    android之listview优化+分类显示

    总结来说,优化ListView主要在于提高滚动时的流畅性,减少不必要的资源消耗,而分类显示则需要灵活运用Adapter和数据结构,创建不同类型的View来展示不同的数据。这两者结合,可以让用户在使用应用时有更好的体验。...

    仿百度外卖、美团外卖、淘点点等左右联动ListView菜单展示

    在“仿百度外卖、美团外卖、淘点点等”的场景中,ListView被用来展示餐厅分类或者菜品类别,通常每个条目都是一个可点击的项,点击后会触发相应的动作,比如展开子菜单或跳转到详细页面。 左右联动的效果是指当用户...

    android 带分类的listview

    在Android开发中,ListView是一种常用的视图组件,用于展示大量数据列表。在“带分类的ListView”场景下,我们通常需要实现类似微信通讯录那样的功能,即数据项按字母顺序分组并显示在左侧边栏,点击边栏字母可快速...

    android中一个简单的LIstView用法例子

    在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据列表,通常用于实现滚动效果。这个简单的ListView用法例子将帮助初学者理解和掌握如何在实际项目中运用ListView。 首先,我们来了解一下...

    ListView的优化及分类显示

    ListView是Android平台上一个非常重要的组件,它用于展示大量的数据列表,是应用开发中常见的视图控件。在处理大量数据时,如果不进行优化,ListView可能会出现性能问题,如滚动卡顿、内存消耗过大等。因此,对...

    嵌套ListView

    - **设置菜单**:在设置菜单中,外部ListView展示大的分类,内部ListView展示该分类下的具体设置项。 ### 嵌套ListView的性能优化 嵌套ListView在性能上可能会有较大的消耗,尤其是当数据量较大时。为了优化性能,...

Global site tag (gtag.js) - Google Analytics