关闭

ExpandableListView的简单使用

标签: expandablelistviewandroid
177人阅读 评论(0) 收藏 举报
分类:

像其他展示类的控件一样,我们来写个步骤

一、在布局中添加控件标签

<?xml version="1.0" encoding="utf-8"?>
<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" >
   <ExpandableListView
        android:id="@+id/expand_List"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       ></ExpandableListView>
</RelativeLayout>

二、在代码中声明并实例化控件

三、建适配器并添加数据

四、最后适配,并添加点击事件

代码:

ExpandableListviewActivity.java
public class ExpandableListviewActivity extends Activity {
    private ExpandableListView expandableListView;
    private MyAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_expandable_listview);
        init();
    }

    public void init() {
        //实例化
        expandableListView = (ExpandableListView) findViewById(R.id.expand_List);
        //一句话可以去掉前面的图标
        //expandableListView.setGroupIndicator(null);
        //适配
        mAdapter = new MyAdapter(this);
        expandableListView.setAdapter(mAdapter);
        //加上如下for循环后,加载程序进来后所有列表项全部展开
//        for(int i = 0; i < mAdapter.getGroupCount(); i++){
//            expandableListView.expandGroup(i);
//        }
        //点击事件
expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
 @Override
 public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
   Toast.makeText(ExpandableListviewActivity.this, groupPosition + "-" + childPosition, Toast.LENGTH_SHORT).show();
  return false;
            }
        });
    }

适配器:
public class MyAdapter extends BaseExpandableListAdapter {

    private Context context;
    //一级item栏图片 和标题
    private int[] logos = new int[]{R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher,};
    private String[] titles = new String[]{"任务1", "任务2", "任务3", "任务4"};
    //二级展示
    private String[][] contents = new String[][]{
            {"Socket", "XMPP", "自学控件", "再自学"},
            {"TabLayout", "线程", "线程池", "EvenBus", "RxJava", "WebView"},
            {"单例模式", "工厂模式", "代理模式", "GreenDao", "蓝牙通讯"},
            {"GIT SVN", "项目打包", "编译与反编译", "扫一扫"},
    };

    public MyAdapter(Context context) {
        this.context = context;
    }

    /**
     * 获取组的个数
     * 返回值:  组的个数
     */
    @Override
    public int getGroupCount() {
        return titles.length;
    }

    /**
     * 获取指定组中的子元素个数
     *
     * @param groupPosition:组位置(决定返回哪个组的子元素个数)
     * @return:指定组的子元素个数
     */
    @Override
    public int getChildrenCount(int groupPosition) {
        return contents[groupPosition].length;
    }


    /**
     * 获取指定组中的数据
     *
     * @param groupPosition:组位置
     * @return:返回组中的数据,也就是该组中的子元素数据
     */
    @Override
    public Object getGroup(int groupPosition) {
        return titles[groupPosition];
    }

    /**
     * 获取指定组中的指定子元素数据。
     *
     * @param groupPosition:组的位置
     * @param childPosition:组中子元素的位置
     * @return:返回指定子元素数据
     */
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return contents[groupPosition][childPosition];
    }

    /**
     * 获取指定组的ID,这个组ID必须是唯一的
     *
     * @param groupPosition:组位置
     * @return:返回组相关ID
     */
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    /**
     * 获取指定组中的指定子元素ID
     *
     * @param groupPosition:
     * @param childPosition:
     * @return:返回具体组里某个元素的ID
     */
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }


    /**
     * 组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。
     *
     * @return:返回一个Boolean类型的值,如果为TRUE,意味着相同的ID永远引用相同的对象
     */
    @Override
    public boolean hasStableIds() {
        return true;
    }

    /**
     * 获取显示指定组的视图对象。这个方法仅返回关于组的视图对象,
     * 要想获取子元素的视图对象,就需要调用getChildView(int, int, boolean, View, ViewGroup)。
     *
     * @param groupPosition:组位置(决定返回哪个视图)
     * @param isExpanded:该组是展开状态还是伸缩状态
     * @param convertView:该组是展开状态还是伸缩状态   注意:在使用前你应该检查一下这个视图对象是否非空并且这个对象的类型是否合适。
     *                                    由此引伸出,如果该对象不能被转换并显示正确的数据,
     *                                    这个方法就会调用getGroupView(int, boolean, View, ViewGroup)来创建一个视图(View)对象。
     * @param parent:返回的视图对象始终依附于的视图组。
     * @return:返回指定组的视图对象
     */
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        ViewHolder1 viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.title_simple, null);
            viewHolder = new ViewHolder1();
           viewHolder.image = (ImageView) convertView.findViewById(R.id.image);
            viewHolder.title = (TextView) convertView.findViewById(R.id.title);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder1) convertView.getTag();
        }
        viewHolder.image.setImageResource(logos [groupPosition]);
        viewHolder.title.setText(titles[groupPosition]);
        return convertView;
    }

    /**
     * 获取一个视图对象,显示指定组中的指定子元素数据。
     *
     * @param groupPosition:组位置(该组内部含有子元素)
     * @param childPosition: 子元素位置(决定返回哪个视图)
     * @param isLastChild:子元素是否处于组中的最后一个
     * @param convertView:  重用已有的视图
     * @param parent:返回的视图(View)对象始终依附于的视图组。
     * @return: 指定位置上的子元素返回的视图对象
     */
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.child_simple, null);
            viewHolder = new ViewHolder();
            viewHolder.conntent = (TextView) convertView.findViewById(R.id.content);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.conntent.setText(contents[groupPosition][childPosition]);

        return convertView;
    }

    public class ViewHolder {
        TextView conntent;

    }

    public class ViewHolder1 {
        TextView title;
        ImageView image;
    }

    /**
     * 是否选中指定位置上的子元素。
     *
     * @param groupPosition:组位置
     * @param childPosition:子元素位置
     * @return:是否选中子元素
     */
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

}


子布局:(自己可丰富样式)
title_simple.xml
<?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="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/image"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_marginLeft="30dp"
        />
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:gravity="center"
        android:text="hello"
        android:layout_marginLeft="10dp" />
</LinearLayout>

child_simple.xml
<?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="match_parent">

    <TextView
        android:id="@+id/content"
        android:layout_marginLeft="15dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

效果如图
很丑,只是个简单的Demo~~~

1
0
查看评论

ExpandableListView扩展(BaseExpandableListAdapter的使用)

针对普通的ExpandableListView的使用,即,需要显示的数据全都是使用TextView显示时,我们使用SimpleExpandableListAdapter就可以了。 但是如果是相对复杂的ExpandableListView,那么SimpleExpandableLi
  • BenW1988
  • BenW1988
  • 2011-10-13 20:05
  • 20476

Expandablelistview 简单使用

Expandablelistview是可展开的listview,通过点击一层title获取对应title下面的content,着重点是ExpandableListViewaAdapter里面各个方法的使用。ExpandableListViewaAdapter中包括父、子 listview的cou...
  • LauraChen93
  • LauraChen93
  • 2017-02-06 15:41
  • 144

Android ExpandableListView 的简单使用

MAinActivity的代码如下所示: public class MainActivity extends Activity { private ExpandableListView mExpandableListView; private ArrayList list; private ...
  • luffy207
  • luffy207
  • 2015-10-08 08:16
  • 208

安卓ExpandableListView的简单使用

2级 分类
  • qq_34536167
  • qq_34536167
  • 2017-09-08 21:40
  • 100

ExpandablelistView+swipeLayout 滑动删除

使用AndroidSwipeLayout可以实现android列表滑动删除的效果,github上地址是AndroidSwipeLayout 因项目需要,在ExpandablelistView中加入左滑删除效果,网上搜索到一篇文章比较合适 ExpandableListView左滑删除项目中实现的...
  • jifashihan
  • jifashihan
  • 2016-07-12 14:41
  • 2584

Android学习笔记:如何对ExpandableListView进行精确的点击或长按控制

在做项目中经常要用到ExpandableListView这个组件来对数据进行显示,使用非常方便。其中也提供了很多对ExpandableListView进行各种操作的监听,如下:   可以看到有对Group点击、长按;有对Child单击、长按;还有纯粹的单击、长按等等。并不是我觉得使...
  • duancanmeng
  • duancanmeng
  • 2012-06-20 10:05
  • 7001

ExpandableListView 去掉默认的箭头

今天项目里,添加了一个功能 工厂和设备的2级listview,当时的想法就是用ExpandableListview 然后在添加布局后,发现一级菜单的向下箭头还在,没有去除吊,后来查了一下资料只要在代码里设置一下属性就好了: //设置 属性 去掉默认向下的箭头 ...
  • sz754155526
  • sz754155526
  • 2016-12-22 11:45
  • 1111

去掉或自定义ExpandableListView的箭头图标

用到ExpandableListView时有个箭头图标系统自带的在你自定义布局也不能去掉只要设置一个属性即可,如下:   settingLists.setGroupIndicator(null);  ~~~~~~~~~~~~~~~~~此处就是设置自定义的箭头图标的。置空则没...
  • fei0724
  • fei0724
  • 2015-01-05 13:15
  • 2974

设置ExpandableListView左边的箭头

Android心得:ExpandableListView 功能界面布局探究之一          本文是最近我对ExpandableListView的探究心得,也总结了网上说的不全面的几个问题: 1、...
  • hhy018
  • hhy018
  • 2015-03-18 15:29
  • 1048

android 自己实现的一个类似expandablelistview的一个控件

类似expandablelistview的一个自定义的可以变化的expandablegridview
  • u011457627
  • u011457627
  • 2015-03-31 21:44
  • 601
    个人资料
    • 访问:19379次
    • 积分:399
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:1篇
    • 译文:0篇
    • 评论:10条
    最新评论