ExpandableListView的用法

ExpandableListView的用法,可以点击展开数据,
效果图如下:
在这里插入图片描述

import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.widget.ExpandableListView;

import com.hjqjl.whdemo.adapter.MyExpandableListViewAdapter;
import com.hjqjl.whdemo.databinding.ActivityMyExpandableListviewBinding;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyExpandableListViewActivity extends BaseActivity {
    public static void actionStart(Context context) {
        Intent intent = new Intent(context, MyExpandableListViewActivity.class);
        context.startActivity(intent);
    }

    private ActivityMyExpandableListviewBinding binding;
    private List<String> parentData;
    private Map<String, List<String>> childDataMap;

    @Override
    protected void initData() {
        binding = ActivityMyExpandableListviewBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);

        parentData = new ArrayList<>();
        childDataMap = new HashMap<>();

        addInfo("1、111111111?", new String[]{"11111111111"});
        addInfo("2、222222?", new String[]{"222", "22222", "2222"});
        addInfo("3、3333333333?", new String[]{"3333", "3333333"});
        addInfo("4、444444444444?", new String[]{"44444", "44444"});
        addInfo("5、5555555555?", new String[]{"555555555"});

        binding.exLvMyExpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {

            @Override
            public void onGroupExpand(int groupPosition) {
                for (int i = 0, count = binding.exLvMyExpandableListView.getExpandableListAdapter().getGroupCount(); i < count; i++) {
                    if (groupPosition != i) {// 关闭其他分组
                        binding.exLvMyExpandableListView.collapseGroup(i);
                    }
                }
            }
        });
    }

    @Override
    protected void processLogic() {
        binding.exLvMyExpandableListView.setAdapter(new MyExpandableListViewAdapter(mContext, parentData, childDataMap));
    }

    /**
     * 给组、子列表添加数据
     *
     * @param p -parentData
     * @param c -child
     */
    private void addInfo(String p, String[] c) {
        parentData.add(p);
        List<String> childItem = new ArrayList<>();
        Collections.addAll(childItem, c);
        childDataMap.put(p, childItem);
    }
}

其中的布局
activity_my_expandable_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">

    <!--android:groupIndicator="@null" 去掉ExpandableListView自带的默认的展开、收起箭头-->
    <ExpandableListView
        android:id="@+id/exLv_myExpandableListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:groupIndicator="@null" />

</LinearLayout>

重写adapter,实现数据的载入

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

import com.hjqjl.whdemo.R;

import java.util.List;
import java.util.Map;

public class MyExpandableListViewAdapter extends BaseExpandableListAdapter {
    private Context mContext;
    private List<String> mParentData;
    private Map<String, List<String>> mChildDataMap;

    public MyExpandableListViewAdapter(Context context, List<String> parentData, Map<String, List<String>> childDataMap) {
        this.mContext = context;
        this.mParentData = parentData;
        this.mChildDataMap = childDataMap;
    }

    @Override
    public int getGroupCount() {
        return mParentData.size();
    }

    // 获取当前父item下的子item的个数
    @Override
    public int getChildrenCount(int groupPosition) {
        String key = mParentData.get(groupPosition);
        return mChildDataMap.get(key).size();
    }

    // 获取当前父item的数据
    @Override
    public Object getGroup(int groupPosition) {
        return mParentData.get(groupPosition);
    }

    // 得到子item需要关联的数据
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        String key = mParentData.get(groupPosition);
        return (mChildDataMap.get(key).get(childPosition));
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    // 得到子item的ID
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    //是否指定分组视图及其子视图的ID对应的后台数据改变也会保持该ID.
    @Override
    public boolean hasStableIds() {
        return true;
    }

    // 设置父item组件
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.item_my_expandable_listview_parent, parent, false);
//				convertView = View.inflate(context, R.layout.question_expandable_parent, null);//这种方法字体样式没变
            holder.parentTv = (TextView) convertView.findViewById(R.id.tv_myExpandableListView_item_parent);
            holder.parentImageViw = (ImageView) convertView.findViewById(R.id.iv_myExpandableListView_item_parent);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.parentTv.setText(mParentData.get(groupPosition));
        // 判断isExpanded就可以控制是按下还是关闭,同时更换图片
        if (isExpanded) {
            holder.parentImageViw.setBackgroundResource(R.drawable.ic_arrow_up);
        } else {
            holder.parentImageViw.setBackgroundResource(R.drawable.ic_arrow_down);
        }

        return convertView;
    }

    // 设置子item的组件
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        String key = mParentData.get(groupPosition);
        String info = mChildDataMap.get(key).get(childPosition);
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.item_my_expandable_listview_children, parent, false);
        }
        TextView tv = (TextView) convertView.findViewById(R.id.tv_myExpandableListView_item_content);
        tv.setText(info);
        return convertView;
    }

    //而isChildSelectable(int groupPosition, int childPosition)用来判断某Group某个child是否可可选。
    //我们可以添加条件控制某Group某个child可点或不可点击。当不加任何条件直接返回false,所有的组的child均不可点击。
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    class ViewHolder {
        private TextView parentTv;
        private ImageView parentImageViw;
    }
}

MyExpandableListViewAdapter 中使用的两个布局:
item_my_expandable_listview_parent.xml

<?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="match_parent"
    android:gravity="center_vertical">

    <!--Android:lineSpacingMultiplier -设置行间距的倍数-->
    <TextView
        android:id="@+id/tv_myExpandableListView_item_parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:gravity="center_vertical"
        android:lineSpacingMultiplier="1.2"
        android:minHeight="50dp"
        android:paddingStart="10dp"
        android:textSize="14sp" />

    <ImageView
        android:id="@+id/iv_myExpandableListView_item_parent"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="20dp" />

</RelativeLayout>

item_my_expandable_listview_children.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:gravity="center_vertical"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_myExpandableListView_item_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:gravity="center_vertical"
        android:lineSpacingMultiplier="1.2"
        android:minHeight="50dp"
        android:padding="10dp"
        android:textSize="12sp" />

</LinearLayout>

源代码:https://gitee.com/hjqjl/WhDemo

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值