Android Fragment点击按钮传递RecyclerView选中项数据的实现问题
我来帮你搞定这个问题!核心思路就是让Adapter记住用户选中的地址数据,然后在Fragment的按钮点击事件里拿到这个数据,再传递给目标Activity。下面是分步实现方案:
1. 完善RecyclerView Adapter的选中状态与数据保存
首先我们要把Adapter里的数据绑定逻辑补全,同时保存用户选中的地址对象,方便后续Fragment调用:
public class AdapterGetAddress extends RecyclerView.Adapter<AdapterGetAddress.ViewHolder> { Context context; private List<ModelGetAddress> modelGetAddressList; // 新增变量:保存选中的地址对象 private ModelGetAddress selectedAddress; private int previousSelected = -1; public AdapterGetAddress(Context context, List<ModelGetAddress> modelGetAddressList) { this.context = context; this.modelGetAddressList = modelGetAddressList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_address, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { final ModelGetAddress adapterAddress = modelGetAddressList.get(position); // 补全数据绑定逻辑 holder.nameUser.setText(adapterAddress.getNameUser()); holder.addressUser.setText(adapterAddress.getAddressUser()); holder.streetName.setText(adapterAddress.getStreetName()); holder.blokAddressUser.setText(adapterAddress.getBlokAddressUser()); holder.cityAddressUser.setText(adapterAddress.getCityAddressUser()); holder.countryUser.setText(adapterAddress.getCountryUser()); holder.phoneUser.setText(adapterAddress.getPhoneUser()); // 设置RadioButton的选中状态 holder.radioButton.setChecked(position == previousSelected); holder.radioButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { previousSelected = position; selectedAddress = adapterAddress; // 保存选中的地址对象 notifyItemRangeChanged(0, modelGetAddressList.size()); } }); } @Override public int getItemCount() { return modelGetAddressList.size(); } // 新增方法:供Fragment获取选中的地址数据 public ModelGetAddress getSelectedAddress() { return selectedAddress; } public class ViewHolder extends RecyclerView.ViewHolder { private TextView nameUser, addressUser, streetName, blokAddressUser, cityAddressUser, countryUser, phoneUser; private RadioButton radioButton; public ViewHolder(@NonNull View itemView) { super(itemView); nameUser = itemView.findViewById(R.id.nameUser); addressUser = itemView.findViewById(R.id.addressUser); streetName = itemView.findViewById(R.id.streetName); countryUser = itemView.findViewById(R.id.countryAddressUser); blokAddressUser = itemView.findViewById(R.id.blokAddressUser); cityAddressUser = itemView.findViewById(R.id.cityAddressUser); phoneUser = itemView.findViewById(R.id.phoneUser); radioButton = itemView.findViewById(R.id.radioButton); } } }
关键修改点说明:
- 补全了
onBindViewHolder里的数据绑定逻辑,把Model的数据显示到对应TextView上 - 新增
selectedAddress变量,保存用户选中的地址对象 - 添加
getSelectedAddress()方法,让Fragment可以获取选中的数据 - 优化了RadioButton的选中状态设置,确保切换选中项时UI正确更新
2. 在Fragment中实现按钮点击与数据传递
接下来修改Fragment的代码,初始化RecyclerView和Adapter,然后在按钮点击时获取选中数据并传递到目标Activity:
public class MenuAddressFragment extends Fragment { private Button gunakanAlamat; // 新增变量:持有Adapter实例 private AdapterGetAddress addressAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_menu_address, container, false); gunakanAlamat = view.findViewById(R.id.gunakanAlamat); // 初始化RecyclerView(这里需要你补充自己的数据源,比如从接口或本地获取) RecyclerView recyclerView = view.findViewById(R.id.rc_tambah_alamat); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); // 假设你已经有了地址数据列表:modelGetAddressList List<ModelGetAddress> modelGetAddressList = new ArrayList<>(); // 替换成你实际的数据源初始化逻辑 // modelGetAddressList = ... addressAdapter = new AdapterGetAddress(getContext(), modelGetAddressList); recyclerView.setAdapter(addressAdapter); gunakanAlamat.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 获取选中的地址数据 ModelGetAddress selectedAddress = addressAdapter.getSelectedAddress(); if (selectedAddress != null) { // 跳转到目标Activity并传递数据 Intent intent = new Intent(getActivity(), TargetActivity.class); // 方式1:逐个传递字符串数据 intent.putExtra("NAME_USER", selectedAddress.getNameUser()); intent.putExtra("STREET_NAME", selectedAddress.getStreetName()); intent.putExtra("COUNTRY_USER", selectedAddress.getCountryUser()); intent.putExtra("BLOK_USER", selectedAddress.getBlokAddressUser()); intent.putExtra("CITY_USER", selectedAddress.getCityAddressUser()); intent.putExtra("PHONE_USER", selectedAddress.getPhoneUser()); // 方式2:如果ModelGetAddress实现了Parcelable,可以直接传递对象(推荐) // intent.putExtra("SELECTED_ADDRESS", selectedAddress); startActivity(intent); } else { // 提示用户未选中地址 Toast.makeText(getContext(), "请先选择一个地址", Toast.LENGTH_SHORT).show(); } } }); return view; } }
关键修改点说明:
- 新增了
addressAdapter变量,持有Adapter实例,方便后续获取选中数据 - 初始化RecyclerView的逻辑补充完整(你需要替换成自己的数据源)
- 在按钮点击事件中,调用
addressAdapter.getSelectedAddress()获取选中数据 - 通过Intent传递数据到目标Activity,提供了两种传递方式:逐个传字符串或传递整个对象(推荐后者,需要让
ModelGetAddress实现Parcelable接口)
额外优化:让Model实现Parcelable(可选但推荐)
如果想直接传递整个地址对象,需要让ModelGetAddress实现Parcelable接口,这样代码更简洁:
public class ModelGetAddress implements Parcelable { private String nameUser; private String addressUser; private String streetName; private String blokAddressUser; private String cityAddressUser; private String countryUser; private String phoneUser; // 构造方法、getter/setter省略... // Parcelable相关实现 protected ModelGetAddress(Parcel in) { nameUser = in.readString(); addressUser = in.readString(); streetName = in.readString(); blokAddressUser = in.readString(); cityAddressUser = in.readString(); countryUser = in.readString(); phoneUser = in.readString(); } public static final Creator<ModelGetAddress> CREATOR = new Creator<ModelGetAddress>() { @Override public ModelGetAddress createFromParcel(Parcel in) { return new ModelGetAddress(in); } @Override public ModelGetAddress[] newArray(int size) { return new ModelGetAddress[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(nameUser); dest.writeString(addressUser); dest.writeString(streetName); dest.writeString(blokAddressUser); dest.writeString(cityAddressUser); dest.writeString(countryUser); dest.writeString(phoneUser); } }
这样在Fragment传递数据时就可以直接用intent.putExtra("SELECTED_ADDRESS", selectedAddress);,在目标Activity中用ModelGetAddress address = getIntent().getParcelableExtra("SELECTED_ADDRESS");获取数据,非常方便。
内容的提问来源于stack exchange,提问作者Muhammad Rafi Bahrur Rizki
相关产品推荐
相关产品推荐

