安卓ExpandableListView的子列表(Child Item)选中状态时改变文本颜色或者改变背景

吐槽

最近再做公司项目的时候,有一个需求:二级列表展示的时候,点击子列表的单个Item时要改变该Item的文本颜色和图片状态,看网上这方面的文章没有特别针对性的,索性就把自己的经验写下来,与同仁们一起交流学习,共同进步。
安卓ExpandableListView的子列表(Child Item)选中状态时改变文本颜色或者改变背景_第1张图片

实现原理

吐槽完,咱们就该书归正传了,如何实现?实现的原理是什么?当我们再做非常普遍的ListView或者RecyclerView的一级列表时,这个需求似乎很容易显示,通常有两个方法就能搞定:1.根据点击的position在Adapter进行匹配设置,相同就实现自己的业务逻辑;2.根据每个Item的id在Adapter进行匹配设置,原理同方法1是一样的。那我们的延伸一下二级列表是否也可以按照方法1进行匹配设置呢?答案是肯定的。其实非常之简单。

代码实现

关键的代码来了,你准备好了吗?

1.首先再 .xml布局文件中

android:id="@+id/one_class_teach_exlist"
android:layout_width=“match_parent”
android:scrollbars=“none”
android:listSelector="#00000000"
android:overScrollMode=“never”
android:childDivider="@color/white"
android:groupIndicator="@null"
android:choiceMode="singleChoice"
android:childIndicator="@null"
android:drawSelectorOnTop=“true”
android:clipToPadding=“false”
android:divider="@color/white"
android:paddingBottom="@dimen/base20dp"
android:layout_height=“match_parent” />

 **一定要加上android:choiceMode="singleChoice"  这个属性**

2.然后是适配器

public class OneClassCatalogAdapter extends BaseExpandableListAdapter {
   private Context mContext;
    private List groupList = new ArrayList<>();
    //在适配器中定义一个 mGroupPosition和mChildPosition 变量
    private int mGroupPosition = -1,mChildPosition = -1;

    public OneClassCatalogAdapter(Context mContext) {
        this.mContext = mContext;
    }
  //定义一个方法 把mGroupPosition和mChildPosition进行设置 并notifyDataSetChanged();
    public void setSelcetPosition(int mGroupPosition,int mChildPosition){
        this.mGroupPosition = mGroupPosition;
        this.mChildPosition = mChildPosition;
        notifyDataSetChanged();
    }

    ...............................(其他的方法省略)
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ChildHolder holder;
        if (convertView == null) {
            holder = new ChildHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.excellent_subject_catalog_second_item_layout, parent, false);
            初始化你的布局中的控件........
            convertView.setTag(holder);
        } else {
            holder = (ChildHolder) convertView.getTag();
        }

       if(mGroupPosition == groupPosition && mChildPosition == childPosition) {
               //这是关键部分 通过mGroupPosition 和 groupPosition 进行比对,然后再通过 mChildPosition 和 childPosition进行比对,就是你点击的那个Iten     写入你要实现的逻辑
            }else {
                
            }
        return convertView;
    }

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

    private class GroupHolder {
        private TextView title;
    }
    private class ChildHolder{
        private RoundedImageView imageView;
        private TextView strokeView,title, time;
    }
}

3.Activity或者Fragment中

ExpandableListView和Adapter的初始化省略…
设置监听 setOnChildClickListener

expandableLlistView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                    if(adapter != null) {
                           //此处设置adapter 点击的  groupPosition和childPosition
                          adapter.setSelcetPosition(groupPosition,childPosition);
                    }
                     return true;
      
            }
        });

如此,以上的需求就能完美实现。是不是很简单?

4.心得

对于一些初级的工程师来说,往往遇到一些需求,第一想到的是百度,其实要想真正的提高自己的技战术,只有自己多想多琢磨,才能真正的实现提高。

你可能感兴趣的:(Android,学习随笔,知识总结)