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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:17:55