RecyclerView实现Pagination适配StaggeredGridLayoutManager后图片不显示求助
问题根因
- 滚动监听逻辑错误:你调用
staggeredGridLayoutManager.findFirstVisibleItemPositions()拿到首个可见项数组后,没有给全局变量firstVisibleItem赋值,导致分页触发条件判断完全错误,会频繁触发getData()方法,列表被反复刷新打断Glide的图片加载流程。 - 分页逻辑完全错误:
getData()方法中每次拿到数据都先清空mUploads再全量添加所有数据,没有做分页数据累加,同时每次调用notifyDataSetChanged()全量刷新列表,导致Glide的图片加载任务被反复取消、重启,图片无法正常加载完成。 - Adapter数据引用错误:
PostAdapter_Home中的mUploads被声明为静态变量,会导致数据引用混乱,也可能引发内存泄漏。 - 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
相关产品推荐
相关产品推荐

