Android RecycleView 实现单选列表 并解决View复用导致错乱问题

来源:互联网 发布:js表格分页插件 编辑:程序博客网 时间:2024/06/06 00:08

1.缓存机制


离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取

因此实现单选的过程中会出现多选的情况或内容错乱,原因是取得是之前的缓存的item布局。

2.解决办法

  1. 使用if else做不同处理

  2. 不同类型item 重写 getItemViewType()

@Override    public int getItemViewType(int position){        return mDatas.get(position).isTitle();    }    //填充onCreateViewHolder方法返回的holder中的控件    @Override    public void onBindViewHolder(MyViewHolder holder, final int position) {        switch (getItemViewType(position)){            case 0:                holder.tv.setText( mDatas.get(position).getWork());                if(mDatas.get(position).isSelected()) {                    holder.layout.setBackgroundColor(mContext.getResources().getColor(R.color.standard));                }                else {                    holder.layout.setBackgroundColor(mContext.getResources().getColor(R.color.white));                }                holder.layout.setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View v) {                        //实现单选方法二: notifyItemChanged() 定向刷新两个视图                        //如果勾选的不是已经勾选状态的Item                        if (mSelectedPos!=position){                            //先取消上个item的勾选状态                            if(mSelectedPos!=-1) {                                mDatas.get(mSelectedPos).setSelected(false);                                notifyItemChanged(mSelectedPos);                            }                            //设置新Item的勾选状态                            mSelectedPos = position;                            mDatas.get(mSelectedPos).setSelected(true);                            notifyItemChanged(mSelectedPos);                        }                    }                });                break;            case 1:                holder.tv.setText( mDatas.get(position).getWork());                break;        }    }    //重写onCreateViewHolder方法,返回一个自定义的ViewHolder    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        MyViewHolder holder=null;        View view=null;        switch(viewType){            case 0:                 view = inflater.inflate(R.layout.item_selectwork_list,parent, false);                holder= new MyViewHolder(view);                break;            case 1:                 view = inflater.inflate(R.layout.item_selectwork_list2,parent, false);                holder= new MyViewHolder(view);                break;        }        return holder;    }

3.DEMO下载

demo1
demo2

0 0