Android中Listview分类显示数据

来源:互联网 发布:淘宝客服电话是五视频 编辑:程序博客网 时间:2024/05/21 22:25

一, 概述
在Android开发中,很多时候会有这样的需求,在数据列表中,按类型来分模块来展示数据,比如联系人列表就是一个非常典型的例子,我们往往会按照姓氏来显示联系人电话列表,这种数据展示的方式非常简单明了,方便,这种效果的实现其实非常简单,下面就从源码对其进行剖析。

二,实现过程
1,效果图:
这里写图片描述

2.创建一个实体类,包含两个属性:(1)分类名;(2)分类数据:
源码:

public class Category {    private Adapter mAdapter;    private String mTitle;    public Category() {    }    public Category(Adapter mAdapter, String mTitle) {        this.mAdapter = mAdapter;        this.mTitle = mTitle;    }    public Adapter getmAdapter() {        return mAdapter;    }    public void setmAdapter(Adapter mAdapter) {        this.mAdapter = mAdapter;    }    public String getmTitle() {        return mTitle;    }    public void setmTitle(String mTitle) {        this.mTitle = mTitle;    }}

这里非常简单,不做任何解释.

2.自定义适配器,这是这个实例中最关键的一部分:
直接贴上源码:

public abstract class CategoryAdapter extends BaseAdapter{    //用于存储分类和类型数据的集合,这里每一个对象为一个分类和其相对应的数据。    private List<Category> categories=new ArrayList();    public void addCategery(String title,Adapter adapter){        categories.add(new Category(adapter,title));    }    @Override    public int getCount() {        int total=0;        for (Category category:categories){            total=total+category.getmAdapter().getCount()+1;        }        return total;    }    @Override    public Object getItem(int position) {        return categories.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        for (Category category:categories){            //如果是第一个,则显示分类的名称            if (position == 0){                return getTitleView(category.getmTitle(),convertView,parent);            }            //否则显示子分类的名称            //每个分类加上其子类的数量            int size=category.getmAdapter().getCount()+1;            if (position < size){                return category.getmAdapter().getView(position-1,convertView,parent);            }            //当position为0时,说明一个分类的数据已经展示完毕,紧接着展示下一个分类的数据            position=position-size;        }        return null;    }    //获取分类数据视图的方法,OOP的思想,留给子类实现该方法,    public abstract View getTitleView(String caption, View convertView, ViewGroup parent);}

3.布局,这里为了方便,没有做太复杂的布局:
主页面的布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="mzbemployeeapp.wellke.com.listviewtypedemo.MainActivity">    <ListView        android:id="@+id/list_view"        android:layout_width="fill_parent"        android:layout_height="fill_parent" /></LinearLayout>

分类标题的布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        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"        android:id="@+id/title"        /></LinearLayout>

4,在Activity初始化数据,并将数据进行展示。

public class MainActivity extends Activity {    ListView listView;    String places[]=new String[]{"北京","上海","杭州","深圳","广州","南京"};        String langlue[]=new String[]{"C++","java","js","html5","C#","framework","J2ee"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }//初始化数据    private void init() {        listView=(ListView)findViewById(R.id.list_view);        adapter.addCategery("地域",new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,places));        adapter.addCategery("开发语言",new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,langlue));        listView.setAdapter(adapter);    }    CategoryAdapter adapter=new CategoryAdapter() {        @Override        public View getTitleView(String caption, View convertView, ViewGroup parent) {            if (convertView == null){                convertView= LayoutInflater.from(MainActivity.this).inflate(R.layout.title_item,parent,false);            }            ((TextView)convertView.findViewById(R.id.title)).setText(caption);            return convertView;        }    };}

到这里,整个实现过程已经结束,如有任何疑问和好的想法,请进行留言。

1 0
原创粉丝点击