ExpandableListView使用中的问题与解决

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 {
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解安卓开发 ExpandableListView使用示例,以下是一个简单的示例: 1. 定义适配器类 ``` public class ExpandableListAdapter extends BaseExpandableListAdapter { private Context mContext; private List<String> mGroupTitles; // 父分组数据 private HashMap<String, List<String>> mChildData; // 子分组数据 public ExpandableListAdapter(Context context, List<String> groupTitles, HashMap<String, List<String>> childData) { mContext = context; mGroupTitles = groupTitles; mChildData = childData; } @Override public int getGroupCount() { return mGroupTitles.size(); } @Override public int getChildrenCount(int groupPosition) { return mChildData.get(mGroupTitles.get(groupPosition)).size(); } @Override public Object getGroup(int groupPosition) { return mGroupTitles.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return mChildData.get(mGroupTitles.get(groupPosition)).get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.list_item_group, null); TextView title = (TextView) view.findViewById(R.id.group_title); title.setText(mGroupTitles.get(groupPosition)); return view; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.list_item_child, null); TextView title = (TextView) view.findViewById(R.id.child_title); title.setText(mChildData.get(mGroupTitles.get(groupPosition)).get(childPosition)); return view; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } ``` 2. 定义布局文件 list_item_group.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="wrap_content" android:orientation="vertical" android:paddingLeft="40dp" android:paddingRight="40dp" android:paddingTop="20dp" android:paddingBottom="20dp"> <TextView android:id="@+id/group_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp" /> </LinearLayout> ``` list_item_child.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="wrap_content" android:orientation="vertical" android:paddingLeft="40dp" android:paddingRight="40dp" android:paddingTop="15dp" android:paddingBottom="15dp"> <TextView android:id="@+id/child_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" /> </LinearLayout> ``` 3. 在 Activity 使用 ExpandableListView ``` public class MainActivity extends AppCompatActivity { private ExpandableListView mExpandableListView; private ExpandableListAdapter mAdapter; private List<String> mGroupTitles; private HashMap<String, List<String>> mChildData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化数据 initData(); // 初始化 ExpandableListView mExpandableListView = (ExpandableListView) findViewById(R.id.expandable_list_view); mAdapter = new ExpandableListAdapter(this, mGroupTitles, mChildData); mExpandableListView.setAdapter(mAdapter); // 设置子项点击监听器 mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Toast.makeText(MainActivity.this, "您点击了" + mChildData.get(mGroupTitles.get(groupPosition)).get(childPosition), Toast.LENGTH_SHORT).show(); return true; } }); } private void initData() { mGroupTitles = new ArrayList<>(); mGroupTitles.add("计算机"); mGroupTitles.add("自然科学"); mGroupTitles.add("哲学"); List<String> computers = new ArrayList<>(); computers.add("Java"); computers.add("Python"); computers.add("C++"); computers.add("PHP"); computers.add("JavaScript"); computers.add("HTML/CSS"); computers.add("SQL"); List<String> sciences = new ArrayList<>(); sciences.add("物理"); sciences.add("化学"); sciences.add("生物"); sciences.add("地理"); sciences.add("天文"); List<String> philosophies = new ArrayList<>(); philosophies.add("伦理学"); philosophies.add("形而上学"); philosophies.add("认识论"); philosophies.add("逻辑学"); philosophies.add("美学"); mChildData = new HashMap<>(); mChildData.put(mGroupTitles.get(0), computers); mChildData.put(mGroupTitles.get(1), sciences); mChildData.put(mGroupTitles.get(2), philosophies); } } ``` 这样,您就可以展示一个带父分组和子分组的 ExpandableListView ,同时设置子项点击监听器,实现相应的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值