如何将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
相关产品推荐
相关产品推荐

