Android RecyclerView滚动时notifyItemChanged动态展开导致不跟手问题求助
解决列表项更新时布局跳动的问题
核心原因
使用notifyItemChanged()更新列表项时,图片加载完成后列表项高度发生变化,RecyclerView会重新计算整体布局,导致上方项展开推挤下方项,出现滚动跳动。
具体解决方法
1. 提前固定列表项高度
如果图片宽高比固定,给图片容器设置固定宽高或按比例计算高度,确保图片加载前后项高度一致:
- 用ConstraintLayout的比例约束示例:
<ImageView android:id="@+id/item_image" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintDimensionRatio="16:9" android:scaleType="centerCrop"/>
2. 带载荷的局部更新
使用notifyItemChanged(int position, Object payload)只更新图片部分,避免全量刷新触发布局重计算:
- Adapter中处理载荷:
@Override public void onBindViewHolder(ItemViewHolder holder, int position, List<Object> payloads) { if (payloads.isEmpty()) { super.onBindViewHolder(holder, position, payloads); } else { for (Object payload : payloads) { if ("UPDATE_IMAGE".equals(payload)) { holder.imageView.setImageURI(data.get(position).getImageUri()); } } } }
- 触发更新时调用:
adapter.notifyItemChanged(position, "UPDATE_IMAGE");
3. 用图片加载库的固定占位图
借助Glide、Picasso等库,设置和目标图片宽高比一致的占位图,维持加载前后布局高度:
- Glide示例:
Glide.with(context) .load(imageUrl) .placeholder(R.drawable.fixed_ratio_placeholder) .into(holder.imageView);
4. 自定义LayoutManager禁止自动调整
如果上述方法无效,自定义LinearLayoutManager固定测量高度:
public class FixedHeightLinearLayoutManager extends LinearLayoutManager { public FixedHeightLinearLayoutManager(Context context) { super(context); } @Override public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) { super.onMeasure(recycler, state, widthSpec, heightSpec); setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight()); } }
内容的提问来源于stack exchange,提问作者Tan Telephone
相关产品推荐
相关产品推荐

