前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ExpandableListView简单应用及listview模拟ExpandableListView

ExpandableListView简单应用及listview模拟ExpandableListView

作者头像
xiangzhihong
发布于 2018-01-30 06:53:29
发布于 2018-01-30 06:53:29
1.3K0
举报
文章被收录于专栏:向治洪向治洪

  首先我们还是来看一些案例,还是拿搜狐新闻客户端,因为我天天上下班没事爱看这个东东,上班又没时间看新闻,上下班路途之余浏览下新闻打发时间嘛.

看这个效果挺棒吧,其实实现起来也不难,我简单说明下.

首先我们用到的控件是:ExpandableListView

布局文件:

代码语言:java
AI代码解释
复制
 <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

代码语言:java
AI代码解释
复制
 /*** 
      * 数据源 
      *  
      * @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

代码语言:java
AI代码解释
复制
 <?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.)

代码语言:java
AI代码解释
复制
 <?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

代码语言:java
AI代码解释
复制
 /*** 
      * 数据源 
      *  
      * @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应该怎么办.

首先配置文件:

代码语言:java
AI代码解释
复制
 <?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>  
代码语言:java
AI代码解释
复制
 /*** 
  * 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);  
     }  
 }  
代码语言:java
AI代码解释
复制
 /*** 
      * 父数据源 
      *  
      * @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重新设置起高度.(相信同学们对这个方法一点也不陌生.)

代码语言:java
AI代码解释
复制
 /*** 
      * 动态设置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了. 

效果图:

嗯,效果还可以吧,就介绍这么多了,如有问题或好的建议请吉留言.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-12-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ExpandableListView实例
demo中有三个group item和多个child item,group item包括一个指示器,一个标题和一个按钮。child item包括一个图片,一个标题和一个按钮。先来实现布局文件 1 activity_main.xml
全栈程序员站长
2022/09/07
1.4K0
可折叠列表ExpandableListView多级选择
上一期学习了AutoCompleteTextView和MultiAutoCompleteTextView,你已经掌握了吗?本期开始学习ExpandableListView的使用。 一、认识ExpandableListView ExpandableListView 是 ListView 的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组,每组里又可包含多个列表项。 ExpandableListView的用法与普通 ListView的用法非常相似,只是 Exp
分享达人秀
2018/02/05
2.6K0
可折叠列表ExpandableListView多级选择
A022-列表容器之ExpandableListView
概述 本节课介绍Android中可实现二级可展开收缩列表的ExpandableListView容器,笔者感觉它非常难用并且难理解,很多时候我们可能需要对控件进行扩展和定制,然而它不太方便扩展,它使用难
巫山老妖
2018/07/20
9310
ExpandableListView实现商品列表折叠
简介 在日常的开发中,有可能会遇到需要一些可以展开的列表,比如QQ的好友列表,电商的购物车折叠显示。Android也给我们提供ExpandableListView类,完美实现这样类似的需求, 极大的方
xiangzhihong
2018/01/26
1.6K0
android ListView 嵌套 ListView
看上去效果还是不错,不过现在有个刷新问题一直没能解决,刷新的时候里面的adapter进行刷新的时候总是会让里面的listview消失掉,应该是父listview先刷新完后,子listview还未刷新完成,导致测量的高度不对,就会消失,像当前组已关闭这种,现在这个问题还没有想到办法解决的,试过比较多的方法,添加接口让子listview 刷新完成后再去更新父listview,但还是没有作用,也用过ExpandableListView,但是效果达不到这种,所以没办法还是得用这种办法,有大神知道怎么解决刷新父listview时子listview消失的方法,指导下我,比较奇怪的时候刚开始初始化的时候子listview是默认不显示的,当点击父listview去张开子listview,父listview应该会再次刷新,但子listview展开是可以的,然后下一次更新数据源的时候子listview又会自动关闭,我猜应该是在刷新子listview的时候,父listview先更新完成,子listview的高度测量就没有对!
全栈程序员站长
2022/09/13
1.4K0
android ListView 嵌套 ListView
Android之微信朋友圈UI实现--ExpandableListView+GridView
这张图是不是很熟悉,没错这个就是朋友圈,里面有一个,里面的布局我都画出来了,我不知道微信具体怎么实现的,但是我们会用安卓原生的方法去实现这样的布局,并有实实在在的数据。
cMusketeer
2018/08/01
1.3K0
Android之微信朋友圈UI实现--ExpandableListView+GridView
ExpandableListView的使用
ExpandableListView组件是android中一个比较常用的组件,当点击一个父item的时候可以将它的子item显示出来,像手机QQ中的好友列表就是实现的类似效果。使用ExpandableListView组件的关键就是设置它的adapter,这个adapter必须继承BaseExpandbaleListAdapter类,所以实现运用ExpandableListView的核心就是学会继承这个BaseExpanableListAdapter类。
提莫队长
2019/03/01
1.4K0
ExpandableListView的使用
Android-ListView 点击展开与收起效果实现
实际上这是采用一个ExpandableListView实现的 布局文件很简单:
圆号本昊
2021/09/24
1.3K0
Android-ListView 点击展开与收起效果实现
工具栏,底部导航栏,可扩展列表视图
这个概念,所接触的很多开发软件或工具,都会碰到。在手机开发的时候,可以进行导航、显示相应的标题等,使开发者不至于在应用程序中迷路。5.0使用Actionbar来实现,很多公司都会对该类进行定制,使用起来更加灵活。5.0之后使用Toolbar来取代之前的Actionbar,这个更加强大。
用户9184480
2024/12/19
1330
Android实现商城购物车功能
最近公司项目做商城模块,需要实现购物车功能,主要实现了单选、全选,金额合计,商品删除,商品数量加减等能,先看看效果图:
SoullessCoder
2019/08/07
4.6K0
Android实现商城购物车功能
站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展
林冠宏-指尖下的幽灵
2018/01/03
1.7K0
站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展
Android仿淘宝购物车,玩转电商购物车
前言 其实做一个电商购物车,还真不是一个轻松的活。但是只要掌握思路,一步一步来做,就会发现也就这样。废物不多说,直接上效果图 完整代码,github链接,希望能给个星,谢谢 效果图 GIF1.gif
用户2032165
2018/06/05
2.9K0
android 三级级联筛选列表
实现的思路:左边这个是listView ,右边是两级的expandListView 
再见孙悟空_
2023/02/10
8610
android 三级级联筛选列表
ListView详细介绍与使用
关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView 的使用方法,和一些需要优化注意的地方,还有日常开发过程中的一些小技巧和经验。
开发者
2019/12/26
1.5K0
ListView详细介绍与使用
【Android从零单排系列二十一】《Android视图控件——ExpandableListView》
小伙伴们,在上文中我们介绍了Android视图组件ListView,本文我们继续盘点,介绍一下视图控件的ExpandableListView。
再见孙悟空_
2023/07/17
5550
Android应用界面开发——ListView,GridView,ScrollView
ListView的意思是列表视图,是应用最广泛的一种视图,例如联系人,功能列表,菜单等等都会用到ListView。
trampcr
2018/09/28
1.5K0
Android应用界面开发——ListView,GridView,ScrollView
相关推荐
ExpandableListView实例
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文