ExpandableListView使用中的问题与解决

本文介绍如何自定义Android中的ExpandableListView组件,包括修改下拉箭头样式与位置、设置分割线颜色与高度以及处理点击事件分发问题。通过具体实例展示了适配器的编写过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ExpandableListView不是什么新鲜的东西了。最近使用到了。记录一下,在修改下拉箭头图片、位置;设置分割线、点击事件分发等问题的内容。

这里写图片描述

  1. 箭头图片、位置的修改
    在xml中配置:
    android:groupIndicator=”@null”
    然后在布局的有右边写一个ImageView之类的就可以了。

    在java中写
    mExpandableListView.setGroupIndicator(null);

  2. 分割线的设置
    在xml中配置:
    android:divider=”#00000000”
    android:childDivider=”#00000000”

    还可以设置dividerHeight等

    在java中写
    mExpandableListView.setDivider(drawable);
    mExpandableListView.setChildDivider(drawable);

  3. 点击事件的问题
    如果在ExpandableListView的主列表item中,包含可以点击的控件,比如Button、CheckBox、RadioButton、ImageButton等。
    ExpandableListView的setOnItemClick会失效

    解决方法是:在ExpandableListAdapter的getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)方法中。

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

    // mImageView是替换下拉箭头的图片控件。
    if (isExpanded) {
        mImageView.setImageResource(R.drawable.expand_up);
    } else {
        mImageView.setImageResource(R.drawable.expand_down);
    }

    mImageView.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View view) {
            if (isExpanded) {
                ((ExpandableListView) parent).collapseGroup(groupPosition);
            } else {
                ((ExpandableListView) parent).expandGroup(groupPosition);
            }
        }
    });
}
  1. Adapter的编写。
    举个栗子:
/**
 * @author ShenYu 20170904
 */

public class ExpandableDataListAdapter extends BaseExpandableListAdapter {
    private Context mContext;
    private LayoutInflater inflater;
    private Map<CompleteResponse.DataBean, String[]> mMap;

    public ExpandableDataListAdapter(Context mContext, Map<CompleteResponse.DataBean, String[]> mMap) {
        this.mContext = mContext;
        inflater = LayoutInflater.from(mContext);
        this.mMap = mMap;
    }

    @Override
    public int getGroupCount() {
        return mMap == null ? 0 : mMap.keySet().size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        if (mMap == null) return  0;
        Set set = mMap.keySet();
        Object[] keyArray = set.toArray();
        String[] valueArray = mMap.get(keyArray[groupPosition]);
        return valueArray == null ? 0 : valueArray.length;
    }

    @Override
    public Object getGroup(int groupPosition) {
        if (mMap == null) return  null;
        Set set = mMap.keySet();
        return set.toArray()[groupPosition];
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        if (mMap == null) return null;
        Set set = mMap.keySet();
        Object[] keyArray = set.toArray();
        return mMap.get(keyArray[groupPosition])[childPosition];
    }

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

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) {
        final GroupViewHolder mGHolder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.item_complete, parent, false);
            mGHolder = new GroupViewHolder();
            mGHolder.ivExpand = (ImageView) convertView.findViewById(R.id.iv_expand);
            convertView.setTag(mGHolder);
        } else {
            mGHolder = (GroupViewHolder) convertView.getTag();
        }

        final boolean flag = isExpanded;
        if (isExpanded) {
            mGHolder.ivExpand.setImageResource(R.drawable.icon_up);
        } else {
            mGHolder.ivExpand.setImageResource(R.drawable.icon_down);
        }
        final ExpandableListView lv = (ExpandableListView) parent;
        mGHolder.ivExpand.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (flag) {
                    lv.collapseGroup(groupPosition);
                } else {
                    lv.expandGroup(groupPosition);
                }
            }
        });

        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        // 子item的布局和数据初始化。
        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }

    private class GroupViewHolder {
        ImageView ivExpand;
    }

    private class ChildViewHolder {
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值