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

1.缓存机制

Android RecycleView 实现单选列表 并解决View复用导致错乱问题_第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

你可能感兴趣的:(android)