可折叠listview(效果与expandablelistview相同)
来源:互联网 发布:中学领导怎么晋升知乎 编辑:程序博客网 时间:2024/06/04 01:33
如果在此之前没接触过listview多条目布局的,可以建议先看下我之前写的博文:
http://blog.csdn.net/lmq121210/article/details/70143217
好了,言归正传,对于可折叠的listview,很多小伙伴们用的都是网上的开源控件expandablelistview,但是还是那句话第三方控件适合外包快速开发,有些自己项目是自己公司的,然后领导要求尽量不使用第三方控件。所以写这个代码仅供大家借鉴参考。
先附上效果图:
概述:要想实现expandablelistview效果,其实也就是自定义adapter,逻辑基本都在adapter里。准备工作1:首先要想实现这种效果就必须用到adapter的多条目(不会的话学会多条目再看本文章)。2:然后每一个item下面的listview是自定义的(listview嵌套listview,不用多说了吧)。
如图1所示,每一个item都是一个listview,然后自己
如图2所示,每一个子item都是一个listview,然后这是子listview的item;
标题1 和下面的name0,name1都是item,这就是adapter多条目布局;
好了重新捋一下思路:最外层是一个listview,然后里面每个item也是一个listview(自定义listview,涉及嵌套问题)。然后在子Item的adapter里根据Bean的flug判断是否是展开还是闭合。最后应该监听一下子listview的第0个Item(标题0,标题1,标题2…),维护flug字段。
上代码
class ATest{ private String name;//标题名字 private String flug;//判断该item是否展开 public String getFlug() { return flug; } public void setFlug(String flug) { this.flug = flug; } private List<BTest> list; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<BTest> getList() { return list; } public void setList(List<BTest> list) { this.list = list; }}class BTest{ private String name;//子Item的名称(name0,name1.....) private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; }}
然后模拟假数据:
aTestList = new ArrayList<>(); for(int i = 0;i < 10;i++){ ATest aTest = new ATest(); aTest.setName("标题" + i); List<BTest> bTests = new ArrayList<>(); for(int j = 0;j < 5;j++){ BTest bTest = new BTest(); bTest.setName("name" + j); bTest.setAge("age" + j); bTests.add(bTest); } aTest.setList(bTests); aTestList.add(aTest); }
接下来是重点adapter:
class AAdapter extends BaseAdapter{ private List<ATest> aTestList; public AAdapter(List<ATest> aTestList) { this.aTestList = aTestList; } @Override public int getCount() { return aTestList.size(); } @Override public Object getItem(int position) { return aTestList.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { AViewHolder aViewHolder; if(convertView == null){ convertView = View.inflate(parent.getContext(), R.layout.stickys_listview, null); aViewHolder = new AViewHolder(); aViewHolder.listView = (MyListview) convertView.findViewById(R.id.mylistview); convertView.setTag(aViewHolder); }else{ aViewHolder = (AViewHolder) convertView.getTag(); } final BTestAdapter bTestAdapter = new BTestAdapter(aTestList, position); aViewHolder.listView.setAdapter(bTestAdapter); return convertView; } class AViewHolder { public MyListview listView; }}
上述代码是最外层listview的adapter;
接下来就是子listview的adapter了,首先我们可以看到图2所示,第0个和其他的内部颜色是不一样的(实际开发中布局也是不一样的)。所以我们必须要用到多布局(0和其他,共两种布局)。
下述代码是子listview的adapter:
class BTestAdapter extends BaseAdapter{ private static final int TYPE_NUMBER1 = 0; private static final int TYPE_NUMBER2 = 1;// private String title_String;// private String flug = "0"; private List<ATest> aList; private int parentPosition; public BTestAdapter(List<ATest> aList, int position) { this.aList = aList; this.parentPosition = position; } @Override public int getCount() { return aList.get(parentPosition).getList().size() + 1; } @Override public Object getItem(int position) { return aList.get(parentPosition).getList().get(position); } @Override public long getItemId(int position) { return 0; } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { if(position == 0){ return TYPE_NUMBER1; }else{ return TYPE_NUMBER2; } } @Override public View getView(final int position, View convertView,final ViewGroup parent) { BTestViewHolder1 bTestViewHolder1 = null; BTestViewHolder2 bTestViewHolder2 = null; int type = getItemViewType(position); if(convertView == null){ switch (type){ case TYPE_NUMBER1:{ convertView = View.inflate(parent.getContext(), R.layout.expand_item1, null); bTestViewHolder1 = new BTestViewHolder1(); bTestViewHolder1.text_title = (TextView) convertView.findViewById(R.id.text_title); convertView.setTag(bTestViewHolder1); break; } case TYPE_NUMBER2:{ convertView = View.inflate(parent.getContext(), R.layout.expand_item2, null); bTestViewHolder2 = new BTestViewHolder2(); bTestViewHolder2.text_name = (TextView) convertView.findViewById(R.id.text_name); bTestViewHolder2.text_age = (TextView) convertView.findViewById(R.id.text_age); bTestViewHolder2.linearlayout = (LinearLayout)convertView.findViewById(R.id.linearlayout); convertView.setTag(bTestViewHolder2); break; } } }else{ switch (type){ case TYPE_NUMBER1:{ bTestViewHolder1 = (BTestViewHolder1) convertView.getTag(); break; } case TYPE_NUMBER2:{ bTestViewHolder2 = (BTestViewHolder2) convertView.getTag(); break; } } } final ATest aTest = aList.get(parentPosition); switch (type){ case TYPE_NUMBER1:{ bTestViewHolder1.text_title.setText(aTest.getName()); bTestViewHolder1.text_title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(aTest.getFlug() == null || aTest.getFlug() == "0"){ aTest.setFlug("1"); }else{ aTest.setFlug("0"); } notifyDataSetChanged(); } }); break; } case TYPE_NUMBER2:{ if("1".equals(aTest.getFlug())){ bTestViewHolder2.text_name.setVisibility(View.VISIBLE); bTestViewHolder2.text_age.setVisibility(View.VISIBLE); bTestViewHolder2.text_name.setText(aTest.getList().get(position - 1).getName()); bTestViewHolder2.text_age.setText(aTest.getList().get(position - 1).getAge()); bTestViewHolder2.linearlayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /** * TODO 处理逻辑 */ Toast.makeText(parent.getContext(), parentPosition + " + " + position, Toast.LENGTH_SHORT).show(); } }); }else{ bTestViewHolder2.text_name.setVisibility(View.GONE); bTestViewHolder2.text_age.setVisibility(View.GONE); } break; } } return convertView; } class BTestViewHolder1{ public TextView text_title; } class BTestViewHolder2{ public TextView text_name; public TextView text_age; public LinearLayout linearlayout; }}
将下述代码摘出,说明重要性。该代码是监听子listview的第0个元素,然后维护flug字段;
bTestViewHolder1.text_title.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(aTest.getFlug() == null || aTest.getFlug() == "0"){ aTest.setFlug("1"); }else{ aTest.setFlug("0"); } notifyDataSetChanged(); } });
注意:里面的TYPE_NUMBER1 一定要从0开始。要不会报数组越界错误。
思路很重要,内部代码都是浮云….!小伙伴们可以多看一下思路。
好了 大功告成了! 有点复杂。一人一思路,其实根据数据Bean结构不同,adapter的书写是不一样的。
欢迎各位小伙伴们指正。
- 可折叠listview(效果与expandablelistview相同)
- 学习Android实现可折叠ListView(ExpandableListView)
- 可折叠的listview的demo...(listview 嵌套 gridview)ExpandableListView
- ExpandableListView(可折叠Listview)用法(具备下拉刷新、上拉加载功能)
- ExpandableListView(可折叠列表)
- ExpandableListView可折叠列表
- 可折叠列表ExpandableListView
- 赵雅智_名片夹(4)_Android中listview可折叠伸缩仿手风琴效果(静态)
- 赵雅智_名片夹(5)_Android中listview可折叠伸缩仿手风琴效果(动态)
- ExpandableListView(listView嵌套)
- ScrollView与ListView,ExpandableListView共存
- Android开发之ListView实现不同品种分类分隔栏的效果(非ExpandableListView实现)
- Android开发之ListView实现不同品种分类分隔栏的效果(非ExpandableListView实现)
- 可折叠的listview
- ListView与ExpandableListView设置分割线 divider
- ListView与ExpandableListView设置分割线 divider
- ExpandableListView + ListView
- 实现可折叠效果
- 写sql语句,模糊查询:instr ----like
- 为什么Java写个带参的构造方法,那无参的就必须再显示写一个
- 微信开发学习总结(一)——微信开发环境搭建
- animate poll plugin
- 微信开发学习总结(二)——微信开发入门
- 可折叠listview(效果与expandablelistview相同)
- 前台富文本编辑器文本乱码,图片正常显示,解决!
- 微信开发学习总结(三)——开发微信公众号的最基本功能——普通消息的接收和回复
- 利用php-cli和任务计划实现订单同步功能
- 后台将map放入jsonobject中,前台从map中取值
- 欢迎使用CSDN-markdown编辑器
- Java后端WebSocket的Tomcat实现
- CENTOS7使用rpm方式安装mysql5.7.18
- JavaScript函数笔记by-Lying