ExpandableListView简单应用及listview模拟ExpandableListView
首先我们还是来看一些案例,还是拿搜狐新闻客户端,因为我天天上下班没事爱看这个东东,上班又没时间看新闻,上下班路途之余浏览下新闻打发时间嘛.
看这个效果挺棒吧,其实实现起来也不难,我简单说明下.
首先我们用到的控件是:ExpandableListView
布局文件:
- <RelativeLayout 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:groupIndicator="@null" 取消默认图片
- android:childIndicatorLeft 设置孩子左边间距
- android:dividerHeight 这个高度一定要设置,不然显示不出来分割线,估计默认为0 吧
- android:childDivider="@drawable/child_bg" 这个直接引color,或者图片会导致整个孩子背景都为这个颜色 ,不知道原因,如果有谁知道,请Give me say.
- -->
- <ExpandableListView
- android:id="@+id/expandablelist"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:cacheColorHint="@null"
- android:childDivider="@drawable/child_bg"
- android:childIndicatorLeft="0dp"
- android:divider="@color/Grey"
- android:dividerHeight="1dp"
- android:groupIndicator="@null"
- android:scrollbarAlwaysDrawHorizontalTrack="true" >
- </ExpandableListView>
- </RelativeLayout>
MyexpandableListAdapter.java
- /***
- * 数据源
- *
- * @author Administrator
- *
- */
- class MyexpandableListAdapter extends BaseExpandableListAdapter {
- private Context context;
- private LayoutInflater inflater;
- public MyexpandableListAdapter(Context context) {
- this.context = context;
- inflater = LayoutInflater.from(context);
- }
- // 返回父列表个数
- @Override
- public int getGroupCount() {
- return groupList.size();
- }
- // 返回子列表个数
- @Override
- public int getChildrenCount(int groupPosition) {
- return childList.get(groupPosition).size();
- }
- @Override
- public Object getGroup(int groupPosition) {
- return groupList.get(groupPosition);
- }
- @Override
- public Object getChild(int groupPosition, int childPosition) {
- return childList.get(groupPosition).get(childPosition);
- }
- @Override
- public long getGroupId(int groupPosition) {
- return groupPosition;
- }
- @Override
- public long getChildId(int groupPosition, int childPosition) {
- return childPosition;
- }
- @Override
- public boolean hasStableIds() {
- return true;
- }
- @Override
- public View getGroupView(int groupPosition, boolean isExpanded,
- View convertView, ViewGroup parent) {
- GroupHolder groupHolder = null;
- if (convertView == null) {
- groupHolder = new GroupHolder();
- convertView = inflater.inflate(R.layout.group, null);
- groupHolder.textView = (TextView) convertView
- .findViewById(R.id.group);
- groupHolder.imageView = (ImageView) convertView
- .findViewById(R.id.image);
- groupHolder.textView.setTextSize(15);
- convertView.setTag(groupHolder);
- } else {
- groupHolder = (GroupHolder) convertView.getTag();
- }
- groupHolder.textView.setText(getGroup(groupPosition).toString());
- if (isExpanded)// ture is Expanded or false is not isExpanded
- groupHolder.imageView.setImageResource(R.drawable.expanded);
- else
- groupHolder.imageView.setImageResource(R.drawable.collapse);
- return convertView;
- }
- @Override
- public View getChildView(int groupPosition, int childPosition,
- boolean isLastChild, View convertView, ViewGroup parent) {
- if (convertView == null) {
- convertView = inflater.inflate(R.layout.item, null);
- }
- TextView textView = (TextView) convertView.findViewById(R.id.item);
- textView.setTextSize(13);
- textView.setText(getChild(groupPosition, childPosition).toString());
- return convertView;
- }
- @Override
- public boolean isChildSelectable(int groupPosition, int childPosition) {
- return true;
- }
- }
- @Override
- public boolean onGroupClick(final ExpandableListView parent, final View v,
- int groupPosition, final long id) {
- return false;
- }
上面实现起来比较简单.相信对listview熟悉的朋友看这个一定很熟悉,无外乎就是多了个孩子.
selector_group.xml
- <?xml version="1.0" encoding="utf-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@color/Grey" android:state_pressed="true"></item>
- <item android:drawable="@color/Grey" android:state_selected="true"></item>
- <item android:drawable="@color/LightGray"></item>
- </selector>
selector_item.xml 同理.
效果图:
效果虽然丑了点,不过就是这么回事,至于显示group的item,还是孩子的item,你可以随意定制.
不想敲的同学,可以下载源码,稍作调整.
/********************************LIstView模拟ExpandableListView**************************************************************/
下面我们接着看一些案例:
其实就是:点击listview的一个item,展开其孩子,点击另一个item,打开其孩子,关闭之前那个孩子.
这个眨一看是ExpandableListView这个东东,可是本人比较笨戳,整了好久没有弄出来,最终放弃,google下,发现有人用listview来模拟实现,也就跟着做了下.
布局文件:(后面多个隐藏text.)
- <?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="wrap_content"
- android:background="@color/white"
- android:gravity="center_vertical"
- android:orientation="vertical" >
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/selector_group"
- android:gravity="center_vertical"
- android:orientation="horizontal"
- android:padding="5dp" >
- <TextView
- android:id="@+id/group"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:textColor="@color/black" />
- <ImageView
- android:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:src="@drawable/collapse" />
- </RelativeLayout>
- <TextView
- android:id="@+id/hint_item"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:padding="10dp"
- android:textColor="@color/black"
- android:visibility="gone" />
- </LinearLayout>
MyAdpter.java
- /***
- * 数据源
- *
- * @author zhangjia
- *
- */
- class MyAdpter extends BaseAdapter {
- private Context context;
- private LayoutInflater inflater;
- private int change_index = -1;// 改变项
- public MyAdpter(Context context) {
- super();
- this.context = context;
- inflater = (LayoutInflater) context
- .getSystemService(context.LAYOUT_INFLATER_SERVICE);
- }
- @Override
- public int getCount() {
- return groupList.size();
- }
- @Override
- public Object getItem(int position) {
- return groupList.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- GroupHolder groupHolder = null;
- if (convertView == null) {
- groupHolder = new GroupHolder();
- convertView = inflater.inflate(R.layout.group, null);
- groupHolder.textView = (TextView) convertView
- .findViewById(R.id.group);
- groupHolder.imageView = (ImageView) convertView
- .findViewById(R.id.image);
- groupHolder.hint_item = (TextView) convertView
- .findViewById(R.id.hint_item);
- convertView.setTag(groupHolder);
- } else {
- groupHolder = (GroupHolder) convertView.getTag();
- }
- groupHolder.textView.setText(groupList.get(position));
- groupHolder.hint_item.setText(childList.get(position));
- if (change_index == position)
- groupHolder.hint_item.setVisibility(View.VISIBLE);
- else
- groupHolder.hint_item.setVisibility(View.GONE);
- return convertView;
- }
- /***
- * 这个方法用于更改子item的状态
- */
- public void changeImageVisable(View view, int position) {
- // 隐藏提示
- if (change_index == position) {
- GroupHolder groupHolder = (GroupHolder) view.getTag();
- if (groupHolder.hint_item.getVisibility() == View.VISIBLE)
- groupHolder.hint_item.setVisibility(View.GONE);
- else
- groupHolder.hint_item.setVisibility(View.VISIBLE);
- } else {
- change_index = position;
- notifyDataSetChanged();// restart getview
- }
- }
- }
这个数据源很简单,只是多了个用于控制孩子隐藏与显示的方法changeImageVisable.代码很简单,相信不用过多解释.
效果:
上面模拟显示的孩子是一个textview(缺点:隐藏textview显示时候点击会影响到其父控件,大家尝试一下,不过肯定有解决办法的.),
下面我来介绍下,如果孩子是listview应该怎么办.
首先配置文件:
- <?xml version="1.0" encoding="utf-8"?>
- <!-- android:descendantFocusability="blocksDescendants"这个属性就可以让父listview获取焦点 -->
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@color/white"
- android:descendantFocusability="blocksDescendants"
- android:gravity="center_vertical"
- android:orientation="vertical" >
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/selector_group"
- android:gravity="center_vertical"
- android:orientation="horizontal"
- android:padding="5dp" >
- <TextView
- android:id="@+id/group"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:text="精品推荐"
- android:textColor="@color/black" />
- <ImageView
- android:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:src="@drawable/collapse" />
- </RelativeLayout>
- <ListView
- android:id="@+id/hint_item"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:textColor="@color/black" />
- </LinearLayout>
- /***
- * InitData
- */
- void InitData() {
- groupList = new ArrayList<String>();
- groupList.add("Ios");
- groupList.add("Android");
- groupList.add("Window");
- childList = new ArrayList<ArrayList<String>>();
- for (int i = 0; i < groupList.size(); i++) {
- ArrayList<String> childTemp;
- if (i == 0) {
- childTemp = new ArrayList<String>();
- childTemp.add("iphone 4");
- childTemp.add("iphone 5");
- } else if (i == 1) {
- childTemp = new ArrayList<String>();
- childTemp.add("Anycall");
- childTemp.add("HTC");
- childTemp.add("Motorola");
- } else {
- childTemp = new ArrayList<String>();
- childTemp.add("Lumia 800C ");
- }
- childList.add(childTemp);
- }
- }
- /***
- * 父数据源
- *
- * @author zhangjia
- *
- */
- class MyAdpter extends BaseAdapter {
- private Context context;
- private LayoutInflater inflater;
- private int change_index = -1;// 改变项
- public MyAdpter(Context context) {
- super();
- this.context = context;
- inflater = (LayoutInflater) context
- .getSystemService(context.LAYOUT_INFLATER_SERVICE);
- }
- @Override
- public int getCount() {
- return groupList.size();
- }
- @Override
- public Object getItem(int position) {
- return groupList.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(final int position, View convertView,
- ViewGroup parent) {
- GroupHolder groupHolder = null;
- if (convertView == null) {
- groupHolder = new GroupHolder();
- convertView = inflater.inflate(R.layout.group_item, null);
- groupHolder.textView = (TextView) convertView
- .findViewById(R.id.group);
- groupHolder.imageView = (ImageView) convertView
- .findViewById(R.id.image);
- groupHolder.hint_item = (ListView) convertView
- .findViewById(R.id.hint_item);
- convertView.setTag(groupHolder);
- } else {
- groupHolder = (GroupHolder) convertView.getTag();
- }
- groupHolder.textView.setText(groupList.get(position));
- groupHolder.hint_item.setAdapter(getListView(childList
- .get(position)));
- groupHolder.hint_item
- .setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent,
- View view, int position_id, long id) {
- Toast.makeText(context,
- childList.get(position).get(position_id), 1)
- .show();
- }
- });
- // 动态设置listview 的高度
- setListViewHeightBaseOnChildren(groupHolder.hint_item);
- if (change_index == position) {
- groupHolder.hint_item.setVisibility(View.VISIBLE);
- groupHolder.imageView.setImageResource(R.drawable.expanded);
- }
- else {
- groupHolder.hint_item.setVisibility(View.GONE);
- groupHolder.imageView.setImageResource(R.drawable.collapse);
- }
- return convertView;
- }
- /***
- * 这个方法用于更改子item的状态
- */
- public void changeImageVisable(View view, int position) {
- // 隐藏提示
- if (change_index == position) {
- GroupHolder groupHolder = (GroupHolder) view.getTag();
- if (groupHolder.hint_item.getVisibility() == View.VISIBLE)
- groupHolder.hint_item.setVisibility(View.GONE);
- else
- groupHolder.hint_item.setVisibility(View.VISIBLE);
- } else {
- change_index = position;
- notifyDataSetChanged();// restart getview
- }
- }
- }
上面代码和刚才的差不多,唯一需要我们注意的是“listview嵌套listview,我们需要注意哪些问题”.
第一:listview和listview嵌套,子listview只显示一个多一点点,不能正常显示,解决办法:对listview重新设置起高度.(相信同学们对这个方法一点也不陌生.)
- /***
- * 动态设置listview的高度
- *
- * @param listView
- */
- public void setListViewHeightBaseOnChildren(ListView listView) {
- ListAdapter listAdapter = listView.getAdapter();
- if (listAdapter == null)
- return;
- int totalHeight = 0;// 总高度
- for (int i = 0; i < listAdapter.getCount(); i++) {
- View listitem = listAdapter.getView(i, null, listView);
- listitem.measure(0, 0);
- totalHeight += listitem.getMeasuredHeight();
- }
- int totalDividerHeight = 0;
- totalDividerHeight = listView.getDividerHeight()
- * (listAdapter.getCount() - 1);
- ViewGroup.LayoutParams layoutParams = listView.getLayoutParams();
- layoutParams.height = totalHeight + totalDividerHeight;
- listView.setLayoutParams(layoutParams);
- }
第二个问题:listview 嵌套listview的时候,子listview会屏蔽掉父listview的焦点.使得父listview无法点击.
解决办法很简单:我们只需要在父listview的Adapter里面的配置文件最顶部的如LinearLayout加入一行: android:descendantFocusability="blocksDescendants"就ok了.
效果图:
嗯,效果还可以吧,就介绍这么多了,如有问题或好的建议请吉留言.
ExpandableListView简单应用及listview模拟ExpandableListView的更多相关文章
- 53、listview、expandableListview如何选中时保持高亮?
一.listView被选中后保持高亮 70down voteaccepted To hold the color of listview item when you press it, include ...
- jquery ajax json简单的分页,模拟数据,没有封装,只显示原理
简单的分页,模拟数据,没有封装,显示原理,大家有兴趣可以自己封装,这里只是个原理过程,真正的分页也差不多是这个原理,只是请求数据不太一样,html部分: <!TOCTYPE HTML> & ...
- ListView模拟微信好友功能
ListView模拟微信好友功能 效果图: 分析: 1.创建listView 2.创建数据 3.创建适配器 将数据放到呈现数据的容器里面. 将这个容器(带数据)连接适配器. 其实是直接在我们自己写的a ...
- 简单的横向ListView实现(version 3.0)
版本号2仅仅是简单的实现了当手指按下的时候listView的Item向左移动一定的距离,并没有随着手指的左右移动而左右滚动.在这个版本号3.0中将会实现随着手指的移动而滚动的目标:当手指向左移动的时候 ...
- 可折叠的listview 之ExpandableListView基本使用
先看效果 demo实现 其他的方法和ListView的方法一样,下面来看看具体demo的实现 首先布局文件很简单,就一个控件为: <?xml version="1.0" en ...
- Android ListView与ExpandableListView设置分割线divider
listview设置分割线需要以下操作: lv.setDivider(getResources().getDrawable(R.drawable.diyline)); ExpandableListVi ...
- 简单的横向ListView实现(version 4.0)
这个版本号的博客写起来颇费口舌.有些代码自己语言组织能力有限,感觉描写叙述起来非常费劲,前前后后改了五六遍稿子还是不尽人意 ,只是我还是坚持写出来自己当初的思路,假设看得不明确的地方我在文章最后仍然会 ...
- 简单几何(线段相交)+模拟 POJ 3449 Geometric Shapes
题目传送门 题意:给了若干个图形,问每个图形与哪些图形相交 分析:题目说白了就是处理出每个图形的线段,然后判断是否相交.但是读入输出巨恶心,就是个模拟题加上线段相交的判断,我第一次WA不知道输出要按字 ...
- jQuery实现的简单文字提示效果模拟title(转)
来源 http://www.cnblogs.com/puzi0315/archive/2012/10/17/2727693.html 模拟title实现效果,可以修改文字的样式,换行等. 文件下载: ...
随机推荐
- gift 分数规划的最大权闭合子图
题目大意: N个物品,物品间有M组关系,每个物品有一个ai的代价,满足关系后会得到bi的值 求 max(sigma(bi)/sigma(ai)) 题解: 很明显的最大权闭合子图,只不过需要处理分数. ...
- 【Toll!Revisited(uva 10537)】
题目来源:蓝皮书P331 ·这道题使得我们更加深刻的去理解Dijkstra! 在做惯了if(dis[u]+w<dis[v])的普通最短路后,这道选择路径方案不是简单的比大小的题横在了 ...
- 例10-1 uva11582(裴波那切数列)
题意:你的任务是计算f(a^b)除以n的余数.其中f(0)=f(1)=1,且对于所有非负整数i,f(i+2)=f(i+1)+f(i). 思路: 由于是模运算,因此整个序列肯定会出现重复序列,所以先找出 ...
- hihocoder #1142 : 三分·三分求极值
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的 ...
- [Noi2016]网格
来自FallDream的博客,未经允许,请勿转载,谢谢. 跳蚤国王和蛐蛐国王在玩一个游戏. 他们在一个 n 行 m 列的网格上排兵布阵.其中的 c 个格子中 (0≤c≤nm),每个格子有一只蛐蛐, ...
- bzoj3038上帝造题的七分钟2
3038: 上帝造题的七分钟2 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1679 Solved: 713[Submit][Status][Dis ...
- bzoj4767两双手 容斥+组合
4767: 两双手 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 684 Solved: 208[Submit][Status][Discuss] ...
- bzip2
压缩和解压缩文件bzip2 options] [file-list] bunzip2 [options] [file-list] bzcat [options] [file-list] bzip2re ...
- jquery form submit提交后无反应 不报错
jquery form onSubmit默认返回false 因为页面添加了validate验证,在刷新页面后重新提交需要加上下一行代码 onSubmit:function() {return true ...
- CRM客户关系管理系统(一)
第一章.CRM介绍和开发流程 1.1.CRM简介 客户关系管理(CRM) 客户关系管理(customer relationship management)的定义是:企业为提高核心竞争力,利用相应的信息 ...