ExpandableListView的使用

来源:互联网 发布:java future isdone 编辑:程序博客网 时间:2024/05/28 15:02

对于我来说ExpandableListView我是最近才开始有所了解,之前都是用ListView或者RecyclerView,有的时候根据特定的需求自定义一些ListView。但如果项目中有类似QQ好友分组这样的效果时,ExpandableListView真的是特别方便。ExpandableListView是一个用来显示二级节点的listview。默认展示的是第一级的分组,点击某个分组后会展开该分组下的子列表。下面先给大家看一下我写的demo里面的效果,可能界面不是很好看,但是效果时完全可以展示给大家看的。
这里写图片描述
下面是主要实现:
这个页面就是要显示的主页面,里面就放了一个ExpandableListView;

<?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="vertical">    <!--childDivider 代表子列表的分割线 -->    <!--divider 代表组列表的分割线 -->    <ExpandableListView        android:id="@+id/expand_list"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:childDivider="@drawable/aliwx_common_double_line"        android:divider="@drawable/aliwx_common_double_line" /></LinearLayout>

下面是每个item的布局:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="70dp">    <ImageView        android:id="@+id/iv"        android:layout_width="50dp"        android:layout_height="50dp"        android:layout_centerVertical="true"        android:src="@mipmap/ic_launcher"        android:layout_marginLeft="20dp"/>    <TextView        android:id="@+id/tv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_toRightOf="@id/iv"        android:layout_marginLeft="10dp"        android:layout_centerVertical="true"        android:textSize="18sp"        android:text="张三"/></RelativeLayout>

以下是Activity里面的代码,Adapter我采用的是内部类:

public class OtherActivity extends AppCompatActivity {    private ExpandableListView mExpandableListView;    private List<String> groupList;    private List<String> childList;    private List<List<String>> itemList;    private List<Integer> groupImg;    private List<Integer> childImg;    private List<List<Integer>> itemImg;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_other);        mExpandableListView = (ExpandableListView) findViewById(R.id.expand_list);        groupList = new ArrayList<>();        groupList.add("我的好友");        groupList.add("同学");        groupList.add("同事");        groupList.add("家人");        groupList.add("陌生人");        childList = new ArrayList<>();        childList.add("张三");        childList.add("李四");        childList.add("王五");        itemList = new ArrayList<>();        for (int i = 0; i < groupList.size(); i++) {            itemList.add(childList);        }        groupImg = new ArrayList<>();        for (int i = 0; i < groupList.size(); i++) {            groupImg.add(R.drawable.ic_play_action_normal);        }        childImg = new ArrayList<>();        for (int i = 0; i < childList.size(); i++) {            childImg.add(R.mipmap.ic_launcher);        }        itemImg = new ArrayList<>();        for (int i = 0; i < groupImg.size(); i++) {            itemImg.add(childImg);        }        //mExpandableListView组点击监听 默认返回false,若每个组里面的子列表如果是空就返回true,代表不展开        mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {            @Override            public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {                Toast.makeText(OtherActivity.this, "group = " + i, Toast.LENGTH_SHORT).show();                if (itemList.get(i).isEmpty()){                    return true;                }                return false;            }        });        //mExpandableListView子列表点击监听时间,返回false代表可以被点击        mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {            @Override            public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {                Toast.makeText(OtherActivity.this, "group = " + i +"child = " + i1, Toast.LENGTH_SHORT).show();                return false;            }        });        mExpandableListView.setAdapter(new MyExpandableAdapter(this));        //设置为null代表去除ExpandableListView自带的指示器,可以自己定义一个指示器        mExpandableListView.setGroupIndicator(null);        //默认展开第几组        mExpandableListView.expandGroup(0);    }    class MyExpandableAdapter extends BaseExpandableListAdapter{        private Context context;        public MyExpandableAdapter(Context context){            this.context = context;        }        /**         *返回组的数目         * 运用三目运算符是防止我们在网络请求的时候获取到的数据可能为null         */        @Override        public int getGroupCount() {            return groupList.size() > 0 ? groupList.size() : 0;        }        /**         *返回指定组中子列表的数目         */        @Override        public int getChildrenCount(int i) {            return itemList.get(i).size() > 0 ? itemList.get(i).size() : 0;        }        /**         *返回指定组中的数据         */        @Override        public Object getGroup(int i) {            return groupList.get(i);        }        /**         *返回指定组中指定子列表中的数据         */        @Override        public Object getChild(int i, int i1) {            return itemList.get(i).get(i1);        }        /**         *返回组指定组中的id         */        @Override        public long getGroupId(int i) {            return i;        }        /**         *返回指定组中指定子列表的id         */        @Override        public long getChildId(int i, int i1) {            return i1;        }        /**         *组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。         */        @Override        public boolean hasStableIds() {            return true;        }        /**         *  获取显示指定组的视图对象         * @param i 组位置         * @param b 是否展开         * @param view 重用已有的视图对象         * @param viewGroup 返回的视图对象始终依附于的视图组         * @return         */        @Override        public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {            GroupHolder groupHolder = null;            if (view == null){                view = LayoutInflater.from(context).inflate(R.layout.expandable_group,null);                groupHolder = new GroupHolder();                groupHolder.ivGroup = (ImageView) view.findViewById(R.id.src);                groupHolder.tvGroup = (TextView) view.findViewById(R.id.tv_name);                view.setTag(groupHolder);            }else {                groupHolder = (GroupHolder) view.getTag();            }            if (! b ){                groupHolder.ivGroup.setImageResource(groupImg.get(i));            }else {                groupHolder.ivGroup.setImageResource(R.drawable.ic_play_action_up);            }            groupHolder.tvGroup.setText(groupList.get(i));            return view;        }        /**         * 获取一个视图对象,显示指定组中的指定子元素的视图。         * @param i 组位置         * @param i1 子列表位置         * @param b 子元素是否处于组中的最后一个         * @param view 重用已有的视图(View)对象         * @param viewGroup 返回的视图(View)对象始终依附于的视图组         * @return         */        @Override        public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {            ChildHolder childHolder = null;            if (view == null){                view = LayoutInflater.from(context).inflate(R.layout.expandable_child,null);                childHolder = new ChildHolder();                childHolder.ivHeader = (ImageView) view.findViewById(R.id.iv);                childHolder.tvChild = (TextView) view.findViewById(R.id.tv);                view.setTag(childHolder);            }else {                childHolder = (ChildHolder) view.getTag();            }            childHolder.ivHeader.setImageResource(itemImg.get(i).get(i1));            childHolder.tvChild.setText(itemList.get(i).get(i1));            return view;        }        /**         * 是否选中指定位置上的子元素。         * @param i         * @param i1         * @return         */        @Override        public boolean isChildSelectable(int i, int i1) {            return true;        }    }    class GroupHolder{        public TextView tvGroup;        public ImageView ivGroup;    }    class ChildHolder{        public TextView tvChild;        public ImageView ivHeader;    }}

刚开始做demo的时候对于里面的有些方便不是很明白,感谢http://blog.csdn.net/wangkeke1860/article/details/46477361的文章帮我解决了很多疑惑。

0 0