【问题标题】:Pass data from RecyclerView to another in fragment将数据从 RecyclerView 传递到片段中的另一个
【发布时间】:2022-07-07 00:13:05
【问题描述】:

我想将数据从 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);
         
        }
    }

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

【问题讨论】:

  • 两个适配器是否在同一个片段中?您是否为您的FruitItemAdapter 实现了选择跟踪器?
  • 不,每个都在不同的片段中

标签: java android android-recyclerview fragment transfer


【解决方案1】:

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

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 to the second adapter
        basketAdapterObject.add(item);
        basketAdapterObject.notifyDataSetChanged();
    }
}

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

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

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2015-01-14
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多