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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:00:05