recycleview的复用问题

原创 2016年06月01日 11:41:40

其实很简单的问题 我不知道我怎么变那么蠢了

我原来想让第0个item改变一下样式之类的,然后就写了这样的代码

@Override
        public void onBindViewHolder(UseHelpViewHolder holder, int position) {




            holder.tvQuestion.setText(data.get(position).getQuestion().getValue());
            holder.tvAnswer.setText(data.get(position).getAnswer().getValue());




            if(position == 0){


                holder.tvQuestion.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);


                holder.tvAnswer.setVisibility(View.GONE);


                holder.tvQuestion.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intent = new Intent(UseHelpActivity.this,SupportDetailActivity.class);
                        startActivity(intent);
                    }
                });


            }
            

        }


然后发现滑下去滑上来的时候,出现了复用的问题,纠结了半天应该怎么弄


后面发现应该这样写

@Override
        public void onBindViewHolder(UseHelpViewHolder holder, int position) {




            holder.tvQuestion.setText(data.get(position).getQuestion().getValue());
            holder.tvAnswer.setText(data.get(position).getAnswer().getValue());




            if(position == 0){


                holder.tvQuestion.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);


                holder.tvAnswer.setVisibility(View.GONE);


                holder.tvQuestion.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intent = new Intent(UseHelpActivity.this,SupportDetailActivity.class);
                        startActivity(intent);
                    }
                });


            }
            else{
                holder.tvQuestion.getPaint().setFlags(Paint.HINTING_OFF);


                holder.tvAnswer.setVisibility(View.VISIBLE);


                holder.tvQuestion.setOnClickListener(null);
            }


        }


就是你之前用这个holder设置了第0个item的,那么当你设置另外的顺序的时候,应该把设置第0个的时候的那些属性取消掉


如果使用quickAdapter,那么则是

mAdapter = new QuickAdapter<UseHelpTo>(this, R.layout.item_use_help){


            @Override
            protected void convert(BaseAdapterHelper helper, UseHelpTo item) {
                LOG.pwh("convert position:"+helper.getAdapterPosition());


                helper.setText(R.id.tv_question, item.getQuestion().getValue());
                helper.setText(R.id.tv_answer, item.getAnswer().getValue());


                if(helper.getAdapterPosition() == 0){


                    TextView tvQuestion = helper.getTextView(R.id.tv_question);
                    TextView tvAnswer = helper.getTextView(R.id.tv_answer);


                    tvQuestion.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
                    tvAnswer.setVisibility(View.GONE);
                    tvQuestion.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            Intent intent = new Intent(UseHelpActivity.this,SupportDetailActivity.class);
                            startActivity(intent);
                        }
                    });




                }
                else{
                    TextView tvQuestion = helper.getTextView(R.id.tv_question);
                    TextView tvAnswer = helper.getTextView(R.id.tv_answer);


                    tvQuestion.getPaint().setFlags(Paint.HINTING_OFF);
                    tvAnswer.setVisibility(View.VISIBLE);
                    tvQuestion.setOnClickListener(null);
                }


            }
        };



如果需要某条数据和之前的数据进行比较而做一些显示方面的改变(比如假如和上一条数据的时间一致就不显示某个控件),那么不能用全局变量保存时间什么的,因为复用会导致出问题的,应该在convert里面这样做

if(position == 0){
                    helper.setVisible(R.id.message_chat_time,true);
                }else{
                    String lastNeedShowTime = mAdapter.getItem(position - 1).getvImMessage().getSendTime();
                    //如果间距相差有2分钟,那么就显示,不然就不显示
                    if(TimeUtil.isTidmeDiffMoreThan(lastNeedShowTime , originTime,2)){
                        helper.setVisible(R.id.message_chat_time,true);
                    }else{
                        helper.setVisible(R.id.message_chat_time,false);
                    }
                }

相关文章推荐

解决RecyclerView代码复用问题

方法一. holder.setIsRecyclable(false);//取消复用,但会造成卡顿 方法二.在Adapter下(就是添加一个标记集合,当是否点击,如果是就添加到这个集合中,否就移除,再...

Recycleview checkbox 复用出现混乱解决方法

今天在做项目的一个我的收藏页面时要实现这么一个效果: 每个item 前面都有一个checkbox ,主要布局是recycleview 。当我们选中某项时,继续往下滑动下面某个的checkbox也...

Android RecyclerView中ViewHolder的复用导致数据错乱解决办法

看图: 视觉效果、recyclerview的基本用法都不说了,超级简单,稍后看代码。 重点来说说item状态的保存问题,其实这个也不是什么新鲜问题,处理起来也不难,方法众多,有setTag的,...

RecyclerView 复用出现 CheckBox 或者 设置背景混乱问题

RecyclerView 复用出现 CheckBox 或者 设置背景混乱问题 由于RecyclerView 与ListView 都使用了复用技术,所以会出现滚动后出现CheckBox选中混乱...

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

1.缓存机制 离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取 因此实现单选的过程中会出现多选的情况或内容错乱,原因是取得是之前的缓存的item布局。 2.解决办...

Android 5.X新特性之RecyclerView基本解析及无限复用

说到RecyclerView,相信大家都不陌生,它是我们经典级ListView的升级版,升级后的RecyclerView展现了极大的灵活性。同时内部直接封装了ViewHolder,不用我们自己定义Vi...
  • guiman
  • guiman
  • 2016年05月04日 09:34
  • 7213

解决RecyclerView复用,导致Item混乱问题,checkbox也类似此做法

一、在onBindViewHolder方法中给要操作的控件setTag holderTwo.item_ll_root.setTag(position); 二、在onBindViewHolder方法中...
  • cgt_cgt
  • cgt_cgt
  • 2016年12月22日 12:43
  • 3915

RecyclerView机制分析: Recycler

Recycler虽然命名上看,像是只承担了View回收的职责,其真正的定位是RecyclerView的View提供者(甚至是管理者), 包括生成新View, 复用旧View,回收View,重新绑定Vi...
  • fyfcauc
  • fyfcauc
  • 2017年01月11日 12:14
  • 913

RecyclerView的Item复用出现问题导致排版混乱

在ListView中用setTag来解决Item的复用问题,但是RecyclerView中已经帮我们封装好了复用,如果在项目中出现了RecyclerView的复用性问题时.可以检查重写的onBindV...

Android RecycleView 里面有按钮点击 复用错位的问题解决

今天做了商城收货地址选择的部分,地址信息又RecycleVeiw展示。里面有一个自己写的TextView 选择那个 那个背景图就是一个对号。而且是单选。之前定义一个int 常量num,每次点击text...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:recycleview的复用问题
举报原因:
原因补充:

(最多只允许输入30个字)