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

如何将RecyclerView选中项数据传递到另一布局并在左侧区域展示

问题解决步骤

你目前的核心问题是创建fragmentInfo实例时没有将选中的Product对象传递给Fragment,导致Fragment无法获取数据填充布局。按以下步骤修改即可:

1. 让Product类实现Parcelable接口

安卓中跨组件传递自定义对象需要先实现Parcelable序列化,示例实现如下:

import android.os.Parcel;
import android.os.Parcelable;

public class Product implements Parcelable {
    private String name;
    private int amount;
    private long price;
    private String imageUri;

    // 原有构造方法、getter、setter保持不变

    protected Product(Parcel in) {
        name = in.readString();
        amount = in.readInt();
        price = in.readLong();
        imageUri = in.readString();
    }

    public static final Creator<Product> CREATOR = new Creator<Product>() {
        @Override
        public Product createFromParcel(Parcel in) {
            return new Product(in);
        }

        @Override
        public Product[] newArray(int size) {
            return new Product[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(amount);
        dest.writeLong(price);
        dest.writeString(imageUri);
    }
}

2. 修改Adapter中条目点击的传参逻辑

将你原有onBindViewHolder里的item点击事件代码替换为以下内容,把选中的Product对象传给Fragment:

holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 获取真实的条目位置,避免列表刷新后位置错位
        int realPosition = holder.getBindingAdapterPosition();
        if (realPosition == RecyclerView.NO_POSITION) return;
        // 获取选中的Product对象
        Product selectedProduct = productArrayList.get(realPosition);
        
        Toast.makeText(holder.itemView.getContext(), ""+realPosition, Toast.LENGTH_SHORT).show();
        AppCompatActivity activity = (AppCompatActivity) view.getContext();
        Fragment myFragment = new fragmentInfo();
        // 封装参数传递给Fragment
        Bundle bundle = new Bundle();
        bundle.putParcelable("selected_product", selectedProduct);
        myFragment.setArguments(bundle);
        
        activity.getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragmentContainerView, myFragment)
                .addToBackStack(null)
                .commit();
    }
});

3. 在fragmentInfo中接收数据并填充布局

在fragmentInfo的onViewCreated方法中取出传递的Product对象,绑定到你左侧布局的对应控件即可:

public class fragmentInfo extends Fragment {
    // 声明你左侧布局的Binding对象,假设为InfoLayoutBinding,替换为你自己的Binding类名
    private InfoLayoutBinding binding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = InfoLayoutBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // 接收传递的Product对象
        if (getArguments() != null) {
            Product selectedProduct = getArguments().getParcelable("selected_product");
            if (selectedProduct != null) {
                // 把数据赋值到左侧布局的对应控件,示例如下,替换为你自己的控件ID
                binding.tvProductName.setText(selectedProduct.getName());
                binding.tvProductPrice.setText(selectedProduct.getPrice() + " TL");
                binding.tvProductAmount.setText(String.valueOf(selectedProduct.getAmount()));
                Picasso.get().load(selectedProduct.getImageUri()).into(binding.ivProductImage);
                // 其他需要展示的字段同理赋值
            }
        }
    }
}

可选优化点

  • 你当前删除条目时调用的notifyDataSetChanged()可以替换为notifyItemRemoved(realPosition),局部刷新性能更好,还会自带系统默认的删除动画
  • 增减数量的点击事件里也可以统一用getBindingAdapterPosition()获取真实位置,避免数据错乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:15:00