相关文章推荐

在片段中把数据从RecyclerView传给另一个人

0 人关注

我想把数据从recyclerview传递到另一个片段中,第一个适配器 用于显示项目,第二个适配器用于篮子片段,想把选定的项目放进去。

适配器,我想从以下方面获取数据

public class FruitItemAdapter extends RecyclerView.Adapter<FruitItemAdapter.viewHolder> {
    ArrayList<FruitItem> fruitItems = new ArrayList<>();
    private Context context;
    public FruitItemAdapter(ArrayList<FruitItem> fruitItems, Context context) {
        this.fruitItems = fruitItems;
        this.context = context;
        notifyDataSetChanged();
    public FruitItemAdapter() {
    @NonNull
    @Override
    public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = 
LayoutInflater.from(parent.getContext()).inflate(R.layout.fruits_item,parent,false);
        viewHolder viewHolder = new viewHolder(view);
        return viewHolder;
    @Override
    public void onBindViewHolder(@NonNull viewHolder holder, int position) {
        final FruitItem data_position = fruitItems.get(position);
        holder.fruit_img.setImageResource(fruitItems.get(position).getFruit_img());
        holder.fruit_name.setText(fruitItems.get(position).getFruit_name());
        holder.fruit_price.setText(fruitItems.get(position).getFruit_price());
    @Override
    public int getItemCount() {
        return fruitItems.size();
    public void setfruitItem(ArrayList<FruitItem> fruitItems) {
        this.fruitItems = fruitItems;
    public static class viewHolder extends RecyclerView.ViewHolder {
        private ImageView fruit_img;
        private  TextView fruit_price, fruit_name;
        public viewHolder(@NonNull View itemView) {
            super(itemView);
            fruit_img = itemView.findViewById(R.id.fruit_img);
            fruit_price = itemView.findViewById(R.id.fruit_price);
            fruit_name = itemView.findViewById(R.id.fruit_name)

这是我想放入数据的篮子片段的适配器。

public class Basket_Adapter extends RecyclerView.Adapter<Basket_Adapter.viewHolder> {
    private Context context;
    ArrayList<FruitItem> fruitItems = new ArrayList<>();
    public Basket_Adapter(Context context, ArrayList<FruitItem> fruitItems) {
        this.context = context;
        this.fruitItems = fruitItems;
        notifyDataSetChanged();
    public Basket_Adapter(){
@NonNull
 @Override
  public Basket_Adapter.viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int   
  viewType) {
View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.fruits_item,parent,false);
viewHolder viewHolder = new viewHolder(view);
      return viewHolder;
    @Override
    public void onBindViewHolder(@NonNull Basket_Adapter.viewHolder holder, int position) {
        holder.fruit_img.setImageResource(fruitItems.get(position).getFruit_img());
        holder.fruit_name.setText(fruitItems.get(position).getFruit_name());
        holder.fruit_price.setText(fruitItems.get(position).getFruit_price());
    @Override
    public int getItemCount() {
        return fruitItems.size();
    public void setfruitItem(ArrayList<FruitItem> fruitItems) {
        this.fruitItems = fruitItems;
    public class viewHolder extends RecyclerView.ViewHolder {
        private ImageView fruit_img;
        private TextView fruit_name;
        private TextView fruit_price;
        public viewHolder(@NonNull View itemView) {
            super(itemView);
            fruit_img = itemView.findViewById(R.id.fruit_img);
            fruit_name = itemView.findViewById(R.id.fruit_name);
            fruit_price = itemView.findViewById(R.id.fruit_price);

现在,我可以用什么来在它们之间传递数据。

5 个评论
这两个适配器在同一个片段中吗?你有没有为你的 FruitItemAdapter 实现一个选择跟踪器?
不,每个人都在不同的片段中
在这种情况下,你可以使用一个 ViewModel 有一个 统计数据 你想在reycler视图之间传递的类型的对象。然后你在另一个片段中观察它的任何变化。当你想传递相关对象时,只需将该对象分配给那个可变的实时数据,使用其 设置值 方法。这就是全部。
你也可以使用一个Java 接口 来传递数据,当一个特定的事件如项目选择发生时。
java
android
android-recyclerview
fragment
transfer
Ismael Hamzeh
Ismael Hamzeh
发布于 2022-07-06
1 个回答
mikeNatali
mikeNatali
发布于 2022-07-07
已采纳
0 人赞同

你可以通过使用 代表团模式 .基本上,你创建了一个相对于第一个适配器的接口(你可以把它放在适配器类里面或外面,这取决于你的编码风格),你需要它作为适配器构造函数里面的一个参数,像这样。

public class FruitItemAdapter extends RecyclerView.Adapter<FruitItemAdapter.viewHolder> {
    private Delegate delegate;
    ArrayList<FruitItem> fruitItems = new ArrayList<>();
    private Context context;
    public FruitItemAdapter(Delegate delegate, ArrayList<FruitItem> fruitItems, Context context) {
        this.delegate = delegate;
        this.fruitItems = fruitItems;
        this.context = context;
        notifyDataSetChanged();
    interface Delegate {
        public void passItem(FruitItem item);

正如你所看到的,这个接口有你需要的方法,但还没有实现。 在这个类中,你可以假装你的委托工作,为你施展魔法,例如在onBindViewHolder中为你的项目的根视图设置一个点击监听器,每次点击都会调用delegate.passItem(fruitItems.get(position))

让我们继续讨论这个片段。

这里是关键部分。这个片段必须通过重写其方法来实现我们刚刚创建的接口。就像这样。

class ExampleFragment extends Fragment implements FruitItemAdapter.Delegate {
    @Override
    public void passItem(FruitItem item) {
        // here you pass the item in a list inside
        // the shared preferences.

对于你的情况,最好的方法是将你的项目存储在数据库中或在共同的偏好. We go with the 共同的偏好 because is simpler, but keep in mind that 共同的偏好 have limited memory capacity and you should use a database like Room而不是。

Inside the override method you pass your item to a list stored in the 共同的偏好. Since your item is not a primitive object i suggest you to look at this answer that show how to store complex object as a string: https://stackoverflow.com/a/18463758/18740763. 在你的案例中,需要被序列化的对象是一个数组或一个对象的列表。

每次你需要在列表中放入一个新的对象时,你需要遵循这些步骤。

  • get the list from 共同的偏好
  • deserialize it
  •  
    推荐文章