Android Studio中Firebase数据加载RecyclerView洗牌出现重复条目如何解决
问题修复方案
根因定位
你当前出现洗牌后条目重复的核心问题是Collections.shuffle()调用位置错误,该方法被放在遍历Firebase子节点的for循环内部,每新增1个符合条件的元素就执行一次洗牌,属于逻辑错误。同时结合RecyclerView的复用机制,未做条目去重、Adapter复用也可能引发绘制重复。
修复步骤
1. 调整洗牌逻辑位置
将Collections.shuffle(list)从for循环内移到for循环结束后,所有符合条件的元素全部加载完成后再执行一次洗牌即可,修改后的onDataChange核心代码如下:
if (dataSnapshot.exists()) { list = new ArrayList<>(); String state; // 新增HashSet做条目去重,避免Firebase返回重复数据 HashSet<String> existDealKeys = new HashSet<>(); for (DataSnapshot ds : dataSnapshot.getChildren()) { String currentKey = ds.getKey(); // 重复key的条目直接跳过 if (existDealKeys.contains(currentKey)) { continue; } Deal value = ds.getValue(Deal.class); value.setKey(currentKey); state = "" + ds.child("VideoStatus").getValue(); if (state.equals("incomplete")) { list.add(value); existDealKeys.add(currentKey); } } // 所有元素加载完成后再执行洗牌 Collections.shuffle(list); // 建议复用Adapter,不要每次都新建,此处保留你的原有逻辑也可运行 AdapterClassssautoclicker adapterClassssautoclicker = new AdapterClassssautoclicker(list); recyclerView.setAdapter(adapterClassssautoclicker); }
2. 优化RecyclerView避免绘制重复
给你的AdapterClassssautoclicker开启稳定ID,避免RecyclerView复用Item时出现绘制错乱重复:
// 在Adapter类中新增以下两个重写方法 @Override public boolean hasStableIds() { return true; } @Override public long getItemId(int position) { // 用每个Deal的唯一key生成ID,保证全局唯一 return list.get(position).getKey().hashCode(); }
3. 自动点击逻辑优化
原有1毫秒延时的点击逻辑不可靠,大概率会出现RecyclerView未完成布局导致点击失效的问题,替换为RecyclerView的内置post任务即可:
// 替换原有Handler延时逻辑 recyclerView.post(() -> { RecyclerView.ViewHolder holder = recyclerView.findViewHolderForAdapterPosition(0); if (holder != null) { holder.itemView.performClick(); } });
内容的提问来源于stack exchange,提问作者Crc Pcl
相关产品推荐
相关产品推荐

