Android ExpandableListView使用(1):使用二维数组封装数据

ExpandableListView 是什么?

一种用于垂直滚动展示两级列表的视图,和 ListView 的不同之处就是它可以展示两级列表,分组可以单独展开显示子选项。这些选项的数据是通过 ExpandableListAdapter 关联的。

效果图:

1.布局文件:

  <ExpandableListView
        android:id="@+id/expand_listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ExpandableListView>

常用属性:

自定义指示器:
  android:groupIndicator="@drawable/group_indicator"

去掉指示器:

 android:groupIndicator="@null"

设置点击item项后该item项的背景色:

  android:listSelector="#00000000"

设置同一个父项下,子类之间的分割线的样式:

android:childDivider="@color/blue_700"  

分割线高度:

android:dividerHeight="1dp"

2.二维数组封装数据:

 public String[] groupData = {"第一组", "第二组", "第三组", "第四组"};

    public String[][] childData = {
            {"第一组——01", "第一组——02", "第一组——03", "第一组——04"},
            {"第二组——01", "第二组——02", "第二组——03", "第一组——04"},
            {"第三组——01", "第三组——02", "第三组——03", "第三组——04"},
            {"第四组——01", "第四组——02", "第四组——03", "第四组——04"}
    };

3.定义分组的视图和子选项的视图

组条目视图:

<?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">

    <TextView
        android:id="@+id/tv_group_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:background="@android:color/holo_blue_light"
        android:paddingLeft="30dp"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:textColor="@android:color/white"
        android:textSize="20sp" />

</LinearLayout>

子条目视图:

<?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">

    <TextView
        android:id="@+id/tv_child_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:paddingLeft="20dp"
        android:text="11"
        android:textSize="20sp" />

</LinearLayout>

4.Activity代码:

package com.xiaoyehai.expandablelistviewdemo.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;

import com.xiaoyehai.expandablelistviewdemo.R;
import com.xiaoyehai.expandablelistviewdemo.adapter.Main2Adapter;

/**
 * 使用二维数组封装数据
 */
public class Main2Activity extends AppCompatActivity {

    private ExpandableListView mExpandableListView;

    private Main2Adapter mMain2Adapter;

    public String[] groupData = {"第一组", "第二组", "第三组", "第四组"};

    public String[][] childData = {
            {"第一组——01", "第一组——02", "第一组——03", "第一组——04"},
            {"第二组——01", "第二组——02", "第二组——03", "第一组——04"},
            {"第三组——01", "第三组——02", "第三组——03", "第三组——04"},
            {"第四组——01", "第四组——02", "第四组——03", "第四组——04"}
    };


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

        mExpandableListView = (ExpandableListView) findViewById(R.id.expand_listview);

        mMain2Adapter = new Main2Adapter(this, groupData, childData);

        mExpandableListView.setAdapter(mMain2Adapter);

        mExpandableListView.expandGroup(0); //设置默认展开

        initListener();


    }

    private void initListener() {
        /**
         *  设置分组项的点击监听事件
         */
        mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView expandableListView, View view, int groupPosition, long id) {
                Toast.makeText(getApplicationContext(), groupData[groupPosition], Toast.LENGTH_SHORT).show();
                // 请务必返回 false,否则分组不会展开
                return false;
            }
        });

        /**
         *  设置子选项点击监听事件
         */
        mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                Toast.makeText(getApplicationContext(), childData[groupPosition][childPosition], Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        /**
         * 分组展开的监听事件
         */
        mExpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {

            }
        });

        /**
         * 分组合并的监听事件
         */
        mExpandableListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
            @Override
            public void onGroupCollapse(int groupPosition) {

            }
        });
    }
}

5.adapte适配器,继承BaseExpandableListAdapter :

package com.xiaoyehai.expandablelistviewdemo.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

import com.xiaoyehai.expandablelistviewdemo.R;

/**
 * Created by xiaoyehai on 2018/3/15 0015.
 */

public class Main2Adapter extends BaseExpandableListAdapter {

    private Context mContext;
    private String[] groupData;
    private String[][] childData;

    public Main2Adapter(Context context, String[] groupData, String[][] childData) {
        mContext = context;
        this.groupData = groupData;
        this.childData = childData;
    }

    /**
     * 获取分组的个数
     *
     * @return
     */
    @Override
    public int getGroupCount() {
        return groupData.length;
    }

    /**
     * 获取指定分组中的子选项的个数
     *
     * @param groupPosition
     * @return
     */
    @Override
    public int getChildrenCount(int groupPosition) {
        return groupData[groupPosition].length();
    }

    /**
     * 获取指定的分组数据
     *
     * @param groupPosition
     * @return
     */
    @Override
    public Object getGroup(int groupPosition) {
        return groupData[groupPosition];
    }

    /**
     * 获取指定分组中的指定子选项数据
     *
     * @param groupPosition
     * @param childPosition
     * @return
     */
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return childData[groupPosition][childPosition];
    }

    /**
     * 获取指定分组的ID, 这个ID必须是唯一的
     *
     * @param groupPosition
     * @return
     */
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    /**
     * 获取子选项的ID, 这个ID必须是唯一的
     *
     * @param groupPosition
     * @param childPosition
     * @return
     */
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    /**
     * 分组和子选项是否持有稳定的ID, 就是说底层数据的改变会不会影响到它们。
     *
     * @return
     */
    @Override
    public boolean hasStableIds() {
        return true;
    }

    /**
     * 获取显示指定分组的视图
     *
     * @param groupPosition
     * @param isExpanded    是否展开
     * @param convertView
     * @param parent
     * @return
     */
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        GroupViewHolder groupViewHolder;
        if (convertView == null) {
            convertView = View.inflate(mContext, R.layout.item_expand_group, null);
            groupViewHolder = new GroupViewHolder(convertView);
            convertView.setTag(groupViewHolder);
        } else {
            groupViewHolder = (GroupViewHolder) convertView.getTag();
        }
        groupViewHolder.tvTitle.setText(groupData[groupPosition]);
        return convertView;
    }

    /**
     * 获取显示指定分组中的指定子选项的视图
     *
     * @param groupPosition
     * @param childPosition
     * @param isLastChild
     * @param convertView
     * @param parent
     * @return
     */
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ChildViewHolder childViewHolder;
        if (convertView == null) {
            convertView = View.inflate(mContext, R.layout.item_expand_child, null);
            childViewHolder = new ChildViewHolder(convertView);
            convertView.setTag(childViewHolder);
        } else {
            childViewHolder = (ChildViewHolder) convertView.getTag();
        }
        childViewHolder.tvTitle.setText(childData[groupPosition][childPosition]);
        return convertView;

    }

    /**
     * 子项是否可选中,如果需要设置子项的点击事件,需要返回true  
     *
     * @param groupPosition
     * @param childPosition
     * @return
     */
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    static class GroupViewHolder {
        private TextView tvTitle;

        public GroupViewHolder(View convertView) {
            tvTitle = (TextView) convertView.findViewById(R.id.tv_group_title);
        }
    }

    static class ChildViewHolder {
        private TextView tvTitle;

        public ChildViewHolder(View convertView) {
            tvTitle = (TextView) convertView.findViewById(R.id.tv_child_title);
        }
    }
}

6.可以自定义箭头的位置和箭头图片

(1)改变默认指示器图片

 android:groupIndicator="@drawable/group_indicator"
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/ic_expand" android:state_expanded="true"/>
    <item android:drawable="@mipmap/ic_collapse"/>
</selector>
<ExpandableListView
    android:id="@+id/expand_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:groupIndicator="@drawable/group_indicator"
    android:indicatorLeft="0dp"
    android:indicatorRight="40dp"
    />
2)去掉默认指示器,自定义指示器位置和图片

 android:groupIndicator="@null" :去掉默认指示器

 @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

        convertView = View.inflate(parent.getContext(), R.layout.item_group_layer_popup_window, null);
        TextView tvTitle = (TextView) convertView.findViewById(R.id.tv_title);
        ImageView ivArrow = (ImageView) convertView.findViewById(R.id.iv_arrow);

        tvTitle.setText(groupList.get(groupPosition).getName());

       //是否展开
        if (isExpanded) {
            ivArrow.setImageResource(R.drawable.ic_expand_up);
        } else {
            ivArrow.setImageResource(R.drawable.ic_expand_down);
        }
        return convertView;
    }

7.更新数据:

 mMain2Adapter.notifyDataSetChanged();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值