当前位置: 首页 > 知识库问答 >
问题:

将数据从RecyclerView传递到片段中的另一个

子车才捷
2023-03-14

我想将数据从回收视图传递到另一个片段中,第一个适配器用于显示项目,第二个适配器用于篮子片段,希望将选定的项目放入。

我要从中获取数据的适配器

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);
         
        }
    }

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

共有1个答案

袁成化
2023-03-14

从你所说的,我了解到这两个回收者是在同一个片段。如果是这样,您可以通过使用委托模式来实现这一点。基本上,您创建了一个相对于第一个适配器的接口(您可以将其放在适配器类内或外部,具体取决于您的编码风格),并且需要将其作为适配器构造函数内的参数,如下所示:

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中项目的根视图上设置一个单击侦听器,该侦听器将调用委托。每次单击时,passItem(foultitems.get(position))。

让我们继续讨论片段。

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

class ExampleFragment extends Fragment implements FruitItemAdapter.Delegate {

    ...

    @Override
    html" target="_blank">public void passItem(FruitItem item) {
        // here you pass the item to the second adapter
        basketAdapterObject.add(item);
        basketAdapterObject.notifyDataSetChanged();
    }
}

在片段内部,您可以访问两个适配器,因此您可以简单地将水果项目传递给第二个适配器。

如果适配器不在同一个片段中,您仍然可以使用此模式,但当覆盖passItem方法而不是向第二个适配器添加项目时,您可以将它们存储在共享首选项中或共享viewModel内的列表中。

 类似资料:
  • 我有两个活动,在活动1中有碎片,在活动2中有碎片 fragment1和fragment2扩展自FragmentActivity1,activity2扩展自AppCompatActivity 我想将字符串值从fragment1发送到fragment2,而不获取空值。我希望你能理解这个问题。谢谢

  • 在FragmentOne.class扩展android.support.v4.app.

  • 这是我完整的logcat: 在Android.support.v4.app.backStackRecord.doaddop(backStackRecord.java:414)在Android.support.v4.app.backStackRecord.replace(backStackRecord.java:449)在Android.support.v4.app.backStackRecord.

  • 我知道的一种方法是通过活动。我们可以将数据从一个片段发送到另一个活动,再从一个活动发送到另一个片段。还有其他方法吗?

  • 我在一个片段中有一个复选框列表(我们称之为FragmentA),我有一个包含两个片段(FragmentB和C)的活动。如果选中一个复选框,我想在片段C中显示一条消息,说明选中了特定的复选框。我需要帮助,因为我不知道如何将(isChecked)从片段A传递到片段C。 FragmentA.java 分数不影响碎片C。 包含片段 B 和 C 的活动 片段C 活动

  • 我找到了这段代码来将数据从一个片段传递到另一个片段: 片段1: 片段2: 但我不想改变片段。所以我拆了一部分。但这不起作用。这里是我的代码: 片段1: 片段2: 我必须使用我在网上找到的代码还是我的版本也能工作?当我打开第二个片段时会出现这个错误: E/AndroidRuntime:致命异常:主进程:com.example.rexan_snerficonquiz.fragment_score.on