RecyclerView滚动时ImageView消失,求排查代码问题
问题根源:ViewHolder复用导致的状态残留
这个问题我太熟了!本质是RecyclerView的ViewHolder复用机制在搞鬼~
RecyclerView会回收滑出屏幕的ViewHolder,再把它重新分配给新滑入的item使用。你之前的代码里,当某个item不需要显示图片时,把holder.image设为View.GONE,但当这个ViewHolder被复用给需要显示图片的新item时,你没有把它的可见性改回View.VISIBLE,所以它会一直保持GONE状态,看起来就“消失”了。
修复方案:绑定前重置View状态
每次绑定ViewHolder时,先把ImageView的可见性重置为默认的VISIBLE,再根据当前item的数据决定是否隐藏。修改你的代码如下:
DataSnapshot d = topics.get(position); holder.text.setText(d.child("caption").getValue(String.class)); // 关键:先重置ImageView的可见性,避免复用旧状态 holder.image.setVisibility(View.VISIBLE); if (d.child("type").getValue(String.class) != null && d.child("type").getValue(String.class).equals("image")){ Glide.with(c).load(d.child("image").getValue(String.class)) .placeholder(R.drawable.background) .centerCrop() .into(holder.image); } else{ holder.image.setVisibility(View.GONE); } holder.name.setText(d.child("username").getValue(String.class)); holder.category.setText(d.child("category").getValue(String.class)); long millis = System.currentTimeMillis(); long posttime = d.child("time").getValue(Long.class); long timedifference = millis - posttime; int days = (int) (timedifference / (1000*60*60*24)); if (days < 2){ holder.time.setText("Today"); }else { holder.time.setText(days+" days ago"); } // 同样处理用户头像的ImageView,避免复用问题 holder.pic.setVisibility(View.VISIBLE); if (d.child("pic").exists()){ Glide.with(c).load(d.child("pic").getValue(String.class)) .placeholder(R.drawable.background) .centerCrop() .into(holder.pic); } else { holder.pic.setVisibility(View.GONE); }
核心原则
RecyclerView的ViewHolder复用意味着:每个View的状态都必须由当前item的数据明确设置,不能依赖上一个item的状态。只要记住这一点,大部分滚动时的UI异常都能解决~
内容的提问来源于stack exchange,提问作者Bucky
相关产品推荐
相关产品推荐

