Android中Listview分类显示数据
2016-01-22 14:25
429 查看
一, 概述
在Android开发中,很多时候会有这样的需求,在数据列表中,按类型来分模块来展示数据,比如联系人列表就是一个非常典型的例子,我们往往会按照姓氏来显示联系人电话列表,这种数据展示的方式非常简单明了,方便,这种效果的实现其实非常简单,下面就从源码对其进行剖析。
二,实现过程
1,效果图:
2.创建一个实体类,包含两个属性:(1)分类名;(2)分类数据:
源码:
这里非常简单,不做任何解释.
2.自定义适配器,这是这个实例中最关键的一部分:
直接贴上源码:
3.布局,这里为了方便,没有做太复杂的布局:
主页面的布局:
分类标题的布局:
4,在Activity初始化数据,并将数据进行展示。
到这里,整个实现过程已经结束,如有任何疑问和好的想法,请进行留言。
在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; } }; }
到这里,整个实现过程已经结束,如有任何疑问和好的想法,请进行留言。
相关文章推荐
- android studio项目依赖第三方报这个错误No such property: sonatypeUserName for class: org.gradle.api.publication.
- android 自定义文本组合控件
- Android 讲解:AsyncTask
- 图片ID与drawable、bitmap之间的转换
- 判断字符串是否为中文
- XMPP协议实现原理介绍
- Android查看jar包源码问题
- Android 时间转换
- Android下怎么使用LDD查看依赖库
- 发送手机短信的倒计时
- Android SDK代理服务器解决国内不能更新下载问题
- Android—AndroidStudio配制
- TextView的重写
- 新手必备的常用 Android 代码片段整理(2)
- Android对大图片进行裁剪避免内存溢出
- Android学习-EditText里面Drawable的点击事件
- Andorid获取本地电话的方法
- Android中的PopupWindow详解
- 用 ViewPager 实现欢迎引导页面
- android 5.0上,阴影elevation无效的问题