您的位置:首页 > 移动开发 > Android开发

Android中Listview分类显示数据

2016-01-22 14:25 429 查看
一, 概述

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


到这里,整个实现过程已经结束,如有任何疑问和好的想法,请进行留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: