You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:08:13