关闭

android:ExpandableListView(可扩展的ListView)使用详解;

标签: androidExpandableListViewListView可扩展的ListView
1898人阅读 评论(2) 收藏 举报
分类:


首先看下效果可以感觉到很多app用到类似的功能,如果最常用的就是咱们的QQ聊天软件,好友分组就可以了用ExpandableListView实现;


ExpandableListView是ListView的子类:


ExpandableListView和ListView用法一样;

同样需要设置一个adapter;

唯一不同的是ListView只需要设置一组数据;而ExpandableListView需要设置组视图和子视图两组数据;


好了先来了解下ExpandAbleListAdapter:

相比ListViewAdapter就要稍微麻烦一些了;

首先需要设置组视图的标签总数、ID、内容 和 子视图的标签总数、ID、内容 还需指定位置相应的组试图;

最后在getGroupView()和getChildView()方法中对组视图和子视图进行设置;

是不是感觉方法很麻烦,但是用起来也非常简单;

比如:getGroupId(),getChildId()和BaseAdapter中的getItemId()方法一样不用管;

hasStableIds(),getGroupCount(),getGroup(),getChildrenCount(),getChild();这5个方法和BaseAdapter中的getCount()方法差不多,都是固定写法,而且非常简单;

唯一代码多一些的getGroupView(),getChildView()和BaseAdapter中的getView用法一模一样;

是不是瞬间感觉爽歪歪,看下具体代码吧:

class MyExpandableListAdapter extends BaseExpandableListAdapter {

        @Override
        //获取组视图标签总数
        public int getGroupCount() {
            return countryTypes.length;
        }

        @Override
        //获取组视图标签的ID
        public long getGroupId(int groupPosition) {
            return 0;
        }

        @Override
        //获取组视图标签内容
        public Object getGroup(int groupPosition) {
            return countryTypes[groupPosition];
        }

        @Override
        //获得子视图标签的总数
        public int getChildrenCount(int groupPosition) {
            return childNames[groupPosition].length;
        }

        @Override
        //获得子视图标签的ID
        public long getChildId(int groupPosition, int childPosition) {
            return 0;
        }

        @Override
        //获得组视图标签下子视图标签的内容
        public Object getChild(int groupPosition, int childPosition) {
            return childNames[groupPosition][childPosition];
        }

        @Override
        //指定位置相应的组试图
        public boolean hasStableIds() {
            return true;
        }

        @Override
        //对组视图标签进行设置
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

            GroupHolder groupHolder;
            if (convertView == null) {
                convertView = View.inflate(context,R.layout.group_item,null);
                groupHolder = new GroupHolder();
                groupHolder.tv = (TextView)convertView.findViewById(R.id.textview);
                groupHolder.iv= (ImageView) convertView.findViewById(R.id.imageview);
                convertView.setTag(groupHolder);
            } else {
                groupHolder = (GroupHolder)convertView.getTag();
            }

            if(isExpanded){
                //当组视图处于扩展状态的时候
                groupHolder.tv.setText(getGroup(groupPosition).toString()+"  ------  ↓");
            }else {
                groupHolder.tv.setText(getGroup(groupPosition).toString()+"  ------  ↑");
            }
            return convertView;
        }

        @Override
        /**
         * 对组视图标签下的子视图标签进行设置
         *
         * @param groupPosition 组位置
         * @param childPosition 子元素位置
         * @param isLastChild 子元素是否处于组中的最后一个
         * @param convertView 重用已有的视图(View)对象
         * @param parent 返回的视图(View)对象始终依附于的视图组
         */
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            ItemHolder itemHolder;
            if(convertView==null){
                convertView=View.inflate(context,R.layout.child_item,null);
                itemHolder=new ItemHolder();
                itemHolder.tv= (TextView) convertView.findViewById(R.id.textview);
                itemHolder.iv= (ImageView) convertView.findViewById(R.id.imageview);
                convertView.setTag(itemHolder);
            }else {
                itemHolder= (ItemHolder) convertView.getTag();
            }

            itemHolder.tv.setText(getChild(groupPosition,childPosition).toString());
            itemHolder.iv.setBackgroundResource(childImageIds[groupPosition][childPosition]);
            return convertView;
        }

        @Override
        //当选择子节点的时候,调用此方法
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
    }


接下来直接给ExpandableListView设置adapter就可以了:

elv= (ExpandableListView) findViewById(R.id.expandable_listview);
        adapter = new MyExpandableListAdapter();
        elv.setAdapter(adapter);

因为ExpandableListView有两个视图,所以条目点击事件也有两个,分别是:组视图的item点击事件,子视图的item点击事件


//组视图 item点击事件
        elv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                ToastUtils.showToast(context,countryTypes[groupPosition]);
                return false;
            }
        });

        //子视图 item点击事件
        elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition, long id) {
                ToastUtils.showToast(context,childNames[groupPosition][childPosition]);
                return false;
            }
        });


点击打开链接免费下载源码




0
0
查看评论

ExpandableListView安卓开发可扩展的listview

//安卓开发:ExpandableListView的用法: public class ExListView extends Activity { private static final String G_TEXT = "g_text"; private static ...
  • Scorpio_gao
  • Scorpio_gao
  • 2016-01-15 12:18
  • 562

android 列表ListView和可扩展列表ExpandableListView的实现

此demo实现了列表ListView和可扩展列表ExpandableListView。 demo:下载地址 ListViewActivity: package fk.androiddemo_16; import android.app.ListActivity; impo...
  • youmingyu
  • youmingyu
  • 2016-10-04 18:29
  • 2349

Android中ExpandableListView的使用(一)

ExpandableListView是可扩展的下拉列表,它的可扩展性在于点击父item可以拉下或收起列表,适用于一些场景的使用
  • sysukehan
  • sysukehan
  • 2016-07-19 23:23
  • 44932

ExpandableListView的使用详解

在Android开发中,我们知道经常会用到ListView来加载一些列表数据,但有时候ListView并不能完全十分满足我们的需求。比如如下图的效果用ExpandableListView实现起来就更方便点,我们直接用ExpandableListView,设置Group不能点击即可。好,费话不多说。下...
  • Jamy2015
  • Jamy2015
  • 2016-04-12 11:17
  • 16733

Android中ExpandableListVivew可扩展的ListView(十二)

前言: ExpandableListVivew是ListView的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组,每组里 又可包含多个列表项。ExpandableListVivew的用法与普通ListView的用法非常相似,只是ExpandableListVive...
  • itarchy
  • itarchy
  • 2015-11-04 18:37
  • 1382

Android ExpandableListView嵌套ListView

ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同的是,它可以有两层:每一层都能够被独立的展开并显示其子项。这些子项来自于与该视图关联的BaseExpandableListAdapter。      有时候简单的Expand...
  • qq_24531461
  • qq_24531461
  • 2017-04-09 16:02
  • 276

Android中ExpandableListView中嵌套ListView

最近项目挺紧张,一直没有时间总结学习,今天把这次项目中一个奇葩的设计,做一下总结。其他的好多的APP中做的通讯录都类似微信通讯录这样,但是我们通讯录却设计成了这样。就是分为两个组,第一个组不需要A-Z的索引,第二组需要A-Z的索引。 看上去不咋的,但是作为我们程序员还是要实现啊。1.实现思路1.写...
  • u010046908
  • u010046908
  • 2016-04-12 20:33
  • 8039

使用ExpandableListView实现ListView嵌套ListView

今天写界面发现是个ListView的嵌套 对我这个新手而言,只能发动网友的力量在网上找demo了,奈何没有找到。。。。(可能我搜索关键词不准确)还浪费了我的积分!后来突然想起之前有用ExpandableListView写过分组列表,让它默认展开并且不能收缩不就实现了我想要的效果了吗?哈哈哈,机智...
  • Heatherhh
  • Heatherhh
  • 2016-07-15 10:34
  • 1057

可扩展的listview~ExpandableListView

之前自己对于这个可扩展的listview的og
  • bzy601638015
  • bzy601638015
  • 2014-06-09 16:58
  • 892

ExpandableListView嵌套ListView导致ListView不能完全显示数据的问题

最近为了得到分组下拉效果,使用了ExpandableListView控件,由于要在子元素显示非常复杂的布局方式,所以子元素采用了Listview进行布局 因此得到了一个问题,就是无论ListView包含多少数据,最多只显示一行。这个问题困扰了我一天上网找了很多,都没有类似的问题,ORZ  ...
  • jianhuanyu
  • jianhuanyu
  • 2015-01-30 17:57
  • 1419
    个人资料
    • 访问:120334次
    • 积分:1785
    • 等级:
    • 排名:千里之外
    • 原创:57篇
    • 转载:0篇
    • 译文:0篇
    • 评论:100条
    最新评论