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

RecyclerView实现Pagination适配StaggeredGridLayoutManager后图片不显示求助

问题根因

  1. 滚动监听逻辑错误:你调用staggeredGridLayoutManager.findFirstVisibleItemPositions()拿到首个可见项数组后,没有给全局变量firstVisibleItem赋值,导致分页触发条件判断完全错误,会频繁触发getData()方法,列表被反复刷新打断Glide的图片加载流程。
  2. 分页逻辑完全错误:getData()方法中每次拿到数据都先清空mUploads再全量添加所有数据,没有做分页数据累加,同时每次调用notifyDataSetChanged()全量刷新列表,导致Glide的图片加载任务被反复取消、重启,图片无法正常加载完成。
  3. Adapter数据引用错误:PostAdapter_Home中的mUploads被声明为静态变量,会导致数据引用混乱,也可能引发内存泄漏。
  4. Glide配置冲突:加载图片时同时调用了centerCrop()和fitCenter()两个互斥的缩放方法,会导致图片渲染异常。

修复方案

1. 修复滚动监听逻辑

修改addOnScrollListener中的代码,补全firstVisibleItem的赋值逻辑:

postRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        visibleItemCount = staggeredGridLayoutManager.getChildCount();
        totalItemCount = staggeredGridLayoutManager.getItemCount();
        int[] firstVisibleItems = null;
        firstVisibleItems = staggeredGridLayoutManager.findFirstVisibleItemPositions(firstVisibleItems);
        // 补全首可见项赋值,多列瀑布流取数组最小值即可,当前1列直接取第0位
        if(firstVisibleItems != null && firstVisibleItems.length > 0) {
            firstVisibleItem = firstVisibleItems[0];
        }
        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
            getData();
            loading = true;
        }
    }
});

2. 修复分页数据加载逻辑

不要全量拉取数据再清空列表,建议实现Firebase分页查询(基于上次最后一条数据的key做分页,限制每次拉取条数),临时修复可以先移除mUploads.clear()逻辑,避免已有数据被清空:

private void getData() {
    // 正式场景请替换为分页查询,例如query.orderByKey().startAt(lastKey).limit(10),不要全量监听
    databaseReference.addValueEventListener(new ValueEventListener() {
        @SuppressLint("NotifyDataSetChanged")
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            if (snapshot.exists()) {
                shimmerFrameLayout.stopShimmer();
                shimmerFrameLayout.setVisibility(View.GONE);
                postRecyclerView.setVisibility(View.VISIBLE);
                // 移除清空逻辑,改为累加新数据并做去重判断
                // mUploads.clear();
                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    Upload upload = dataSnapshot.getValue(Upload.class);
                    assert upload != null;
                    upload.setmKey(dataSnapshot.getKey());
                    boolean isExist = false;
                    for(Upload item : mUploads) {
                        if(item.getmKey().equals(upload.getmKey())) {
                            isExist = true;
                            break;
                        }
                    }
                    if(!isExist) {
                        mUploads.add(upload);
                    }
                }
            }
            postsAdapter.setUploads(mUploads);
            postsAdapter.notifyDataSetChanged();
        }
        @Override
        public void onCancelled(@NonNull DatabaseError error) {
        }
    });
}

3. 修复Adapter静态变量问题

去掉PostAdapter_Home中mUploads的static修饰符:

// 修改前:public static List<Upload> mUploads;
public List<Upload> mUploads;

4. 修复Glide配置冲突

保留一个缩放方法即可,比如保留centerCrop():

Glide.with(mcontext)
    .load(uploadCurrent.getmImageUrl())
    .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
    .placeholder(shimmerDrawable)
    .centerCrop()
    // 移除冲突的fitCenter()
    // .fitCenter()
    .into(holder.imageView);

内容的提问来源于stack exchange,提问作者Vasant Raval

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:15:03