Firebase+RecyclerView Adapter异常:超过5项时点击跳转显示错误
RecyclerView适配器条目超5个后点击跳转详情异常的问题解决
问题根源
你代码里的核心问题是把ViewholderRecommendedBinding binding定义成了类全局成员变量。RecyclerView的ViewHolder是会被复用的,当条目数量超过一屏(也就是你说的5个)时,新创建的ViewHolder会覆盖这个全局binding,导致onBindViewHolder里更新UI时错误操作其他复用ViewHolder的视图,点击事件也会因为绑定的是被覆盖的binding对应的位置,出现跳错详情的情况。
修复方案
把binding的作用域限定在每个ViewHolder内部,让每个ViewHolder持有自己的binding实例,避免全局变量被复用覆盖:
修复后的完整代码
package com.app.rednet.myspaceapp.Adapter; import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.app.rednet.myspaceapp.Activity.DetailActivity; import com.app.rednet.myspaceapp.Domain.ItemDomain; import com.app.rednet.myspaceapp.databinding.ViewholderRecommendedBinding; import com.bumptech.glide.Glide; import java.util.ArrayList; public class RecommendedAdapter extends RecyclerView.Adapter<RecommendedAdapter.Viewholder> { private final ArrayList<ItemDomain> items; private Context context; public RecommendedAdapter(ArrayList<ItemDomain> items) { this.items = items; this.context = null; } @NonNull @Override public RecommendedAdapter.Viewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { ViewholderRecommendedBinding binding = ViewholderRecommendedBinding.inflate(LayoutInflater.from(viewGroup.getContext()), viewGroup, false); context = viewGroup.getContext(); return new Viewholder(binding); } @Override public void onBindViewHolder(@NonNull RecommendedAdapter.Viewholder viewholder, int i) { // 使用当前ViewHolder自己的binding,而非全局变量 ViewholderRecommendedBinding binding = viewholder.binding; binding.titleTxt.setText(items.get(i).getTitle()); binding.priceTxt.setText("MWK" + items.get(i).getPrice()); binding.addressTxt.setText(items.get(i).getAddress()); binding.scoreTxt.setText("" + items.get(i).getScore()); Glide.with(context) .load(items.get(i).getPic()) .into(binding.pic); viewholder.itemView.setOnClickListener(v -> { int position = viewholder.getBindingAdapterPosition(); if (position != RecyclerView.NO_POSITION) { Intent intent = new Intent(context, DetailActivity.class); ItemDomain item = items.get(position); intent.putExtra("object", item); context.startActivity(intent); } }); } @Override public int getItemCount() { return items.size(); } // ViewHolder持有自己的binding实例 public class Viewholder extends RecyclerView.ViewHolder { public final ViewholderRecommendedBinding binding; public Viewholder(ViewholderRecommendedBinding binding) { super(binding.getRoot()); this.binding = binding; } } }
关键修改点
- 移除了类级别的全局
binding变量,改为在onCreateViewHolder中局部创建并传递给ViewHolder - 让
ViewHolder类持有自己的binding成员变量,确保每个ViewHolder的绑定对象独立 - 在
onBindViewHolder中通过viewholder.binding获取当前ViewHolder对应的视图绑定,避免复用冲突 - 保留了
getBindingAdapterPosition()的正确用法,确保获取当前条目的最新位置
这样修改后,不管条目数量多少,每个ViewHolder的视图和点击事件都会正确绑定到对应的数据,不会再出现跳错详情的问题。
内容的提问来源于stack exchange,提问作者Rednet
相关产品推荐
相关产品推荐

