Android 分组listview 简易实现方法

来源:互联网 发布:http协议 json参数 编辑:程序博客网 时间:2024/05/16 05:30

原文链接:http://codesblock.com/?p=111

在Android开发中,listview成为activity非常常用的基本组件之一,但是需求往往比较复杂,listview需要承载的数据往往有多种表现形式。

有些需求更是需要scrollview中嵌套listview才能很好的实现,但是Android并没有提供一个合理的scrollview中嵌套listview的解决方案。

在scrollview中嵌套listview会导致listview的高度无法正确计算。就算使用常用的解决方案--根据listview的内容动态设置listview的高度,仍然会导致一个最严重的问题--由于listview的touch事件被scrollview吃掉了,listview中的子view无法再重用,listview的优势荡然无存。

我通过继承了BaseAdapter实现了一个AbsGroupListAdapter,使用最简易的方法实现多分组的listview实现。使用非常简单,只要继承AbsGroupListAdapter,并重写getChildView方法,就可以实现分组显示不同的view.

class GroupAdapter extends AbsGroupAdapter {public GroupAdapter(Context context) {super(context);}@Overridepublic View getChildView(View probableView, int groupIndex, int childIndex, int position, ViewGroup parent) {switch (groupIndex) {case 0://根据组别返回不同的view,并且view可高度复用,每个组别下发的probableview类型都是相应组别的使用过的view类型TextView view = null;if (probableView != null) {view = (TextView) probableView;} else {view = new TextView(mContext);}view.setText("position:" + childIndex);return view;case 2:ImageView view2 = null;if (probableView != null) {view2 = (ImageView) probableView;} else {view2 = new ImageView(mContext);}view2.setImageResource(android.R.drawable.ic_dialog_email);return view2;case 3:Button button = null;if (probableView != null) {button = (Button) probableView;} else {button = new Button(mContext);}button.setText("button:" + childIndex);return button;default:break;}return null;}}

为listview设置这个adapter也非常简单,只需要几行代码就能实现分组功能

ListView listView = (ListView) findViewById(R.id.listview);        final GroupAdapter adapter = new GroupAdapter(getApplicationContext());        adapter.bindListView(listView); //重要,为adapter绑定listview        listView.setAdapter(adapter); //与普通adapter相同               adapter.addGroup(10); // add a group 增加一个组,只需要输入组的内容数量就可以添加了        final ImageView image = new ImageView(getApplicationContext());        image.setImageResource(R.drawable.image);        adapter.addStableView(image); // add a view 这个方法可以添加一个固定的view,这个view不可以复用到listview中的其他内容中。        adapter.addGroup(10); // add a group        adapter.addGroup(10); // add a group        adapter.notifyDataSetChanged();

如图所示,此listview共分为3个组,组一是textview、组二是一张图片、组三是imageview。

源码已经上传到github中,可以随便下载源码和demo。


1 0