Java 将数据从RecyclerView.Adapter传递到片段onClick

Java 将数据从RecyclerView.Adapter传递到片段onClick,java,android,android-recyclerview,fragment,adapter,Java,Android,Android Recyclerview,Fragment,Adapter,我试图弄清楚如何从RecyclerView中单击的项目到片段中的listview中获取数据。我似乎不知道该怎么做,因为我无法让我的包工作 我在这里尝试了Stackoverflow上提供的各种解决方案,但没有一个有效。我已经设法从recyclerview中获取了信息,但我一直在试图找出如何将其传递给片段。有人能帮我吗 适配器类: public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.ViewHolder> {

我试图弄清楚如何从RecyclerView中单击的项目到片段中的listview中获取数据。我似乎不知道该怎么做,因为我无法让我的包工作

我在这里尝试了Stackoverflow上提供的各种解决方案,但没有一个有效。我已经设法从recyclerview中获取了信息,但我一直在试图找出如何将其传递给片段。有人能帮我吗

适配器类:

public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.ViewHolder> {

    private Context context;

    ArrayList<FoodActivity> list;
    public FoodAdapter(ArrayList<FoodActivity> list){
        this.list = list;
    }


    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listview_item_food, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
        holder.foods.setText(list.get(position).getName());
        holder.carbo.setText(list.get(position).getCarbohydrates());
        holder.protein.setText(list.get(position).getProtein());
        holder.fats.setText(list.get(position).getFats());

        //Get items from recyclerview when user clicks them. Then send them to FoodFragment
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String foods = list.get(position).getName();
                String carbo = list.get(position).getCarbohydrates();
                String protein = list.get(position).getProtein();
                String fats = list.get(position).getFats();

                Toast.makeText(v.getContext(), "test: " + foods, Toast.LENGTH_SHORT).show();


            }
        });
    }


    @Override
    public int getItemCount() {
        return list.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        TextView foods, carbo, fats, protein;

        public ViewHolder(View itemView) {
            super(itemView);

            carbo = itemView.findViewById(R.id.carbo);
            protein = itemView.findViewById(R.id.protein);
            fats = itemView.findViewById(R.id.fats);
            foods = itemView.findViewById(R.id.food);
        }
    }
}

要将数据从FoodAdapter获取到TrackingFragment,可以将TrackingFragment(或者理想情况下它实现的接口)作为参数添加到FoodAdapter构造函数,然后使用该实例将ViewHolder单击转发到TrackingFragment进行处理


要从TrackingFragment到FoodFragment获取数据,请使用setTargetFragment/onActivityResult模式进行片段通信。这个答案有一个例子:

最简单的方法是向活动中添加所需的变量,使用onClick()设置它们的值,然后检索其他片段中的数据:

  • 在活动中:

    String foods;
    
    public String getFoods() {
        return foods;
    }
    
    public void setFoods(String foods) {
        this.foods = foods;
    }
    
  • 在适配器中:

       holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               ((YourActivity)getActivity()).setFoods("Any value");
            }
        });
    
  • 在目标片段中:

    String foods=((YourActivity)getActivity()).getFoods()


向适配器添加一个接口,如下所示

public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.ViewHolder> {

interface OnClickListener {
    void onClick(FoodActivity clickedItem);
}

private OnClickListener mCallback; 
private ArrayList<FoodActivity> list;

public FoodAdapter(ArrayList<FoodActivity> list){
    this.list = list;
}

public void setOnClickListener(OnClickListener callback) {
    mCallback = callback;
}


@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listview_item_food, parent, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    holder.foods.setText(list.get(position).getName());
    holder.carbo.setText(list.get(position).getCarbohydrates());
    holder.protein.setText(list.get(position).getProtein());
    holder.fats.setText(list.get(position).getFats());

    //Get items from recyclerview when user clicks them. Then send them to FoodFragment
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mCallback != null)
                mCallback.onClick(list.get(position));
        }
    });
}


@Override
public int getItemCount() {
    return list.size();
}

class ViewHolder extends RecyclerView.ViewHolder {
    TextView foods, carbo, fats, protein;

    public ViewHolder(View itemView) {
        super(itemView);

        carbo = itemView.findViewById(R.id.carbo);
        protein = itemView.findViewById(R.id.protein);
        fats = itemView.findViewById(R.id.fats);
        foods = itemView.findViewById(R.id.food);
    }
}
}
公共类FoodAdapter扩展了RecyclerView.Adapter{
接口OnClickListener{
单击void onClick(FoodActivity clickedItem);
}
私有OnClickListener mCallback;
私有数组列表;
公共食品数据库(ArrayList列表){
this.list=列表;
}
公共void setOnClickListener(OnClickListener回调){
mCallback=回调;
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.listview\u item\u food,parent,false);
返回新的ViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull final ViewHolder,final int position){
holder.foods.setText(list.get(position.getName());
holder.carbo.setText(list.get(position.getcarbo碳水化合物());
holder.protein.setText(list.get(position.getProtein());
holder.fats.setText(list.get(position.getFats());
//当用户单击项目时,从recyclerview获取项目。然后将其发送到FoodFragment
holder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(mCallback!=null)
onClick(list.get(position));
}
});
}
@凌驾
public int getItemCount(){
返回list.size();
}
类ViewHolder扩展了RecyclerView.ViewHolder{
TextView食品、碳水化合物、脂肪、蛋白质;
公共视图持有者(视图项视图){
超级(项目视图);
carbo=itemView.findviewbyd(R.id.carbo);
蛋白质=itemView.findViewById(R.id.protein);
fats=itemView.findViewById(R.id.fats);
foods=itemView.findviewbyd(R.id.food);
}
}
}

基于此代码,很难说您在哪里使用
FoodFragment
。两个片段是否在同一活动中?你有
FoodAdapter
TrackingFragment
,对吗?我不太清楚你的意思。通过bottomNavigationView从MenuActivity调用FoodFragment,然后从FoodFragment调用TrackingFragment。FoodAdapter连接到TrackingFrackment是的。但您的布局是如何设计的?你有一个菜单活动,它显示食物碎片,当你选择某样东西时,你用TrackingFragment替换你的食物碎片,或者你打开一个新的活动,它显示跟踪碎片?在菜单活动中,我在FrameLayout中有一个碎片容器。我只要在需要显示新片段时替换容器中的片段即可。感谢您花时间回答。我尝试过在FoodFragment中获取数据,但似乎无法使其正常工作(我以前没有使用过接口,我尝试过的东西也不起作用)。你介意告诉我如何检索这些数据吗?这与Kotlin兼容吗?是的,为什么不兼容?但这太简单了,我不允许一个认真的开发人员。我建议您在适配器中使用回调。
   holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           ((YourActivity)getActivity()).setFoods("Any value");
        }
    });
public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.ViewHolder> {

interface OnClickListener {
    void onClick(FoodActivity clickedItem);
}

private OnClickListener mCallback; 
private ArrayList<FoodActivity> list;

public FoodAdapter(ArrayList<FoodActivity> list){
    this.list = list;
}

public void setOnClickListener(OnClickListener callback) {
    mCallback = callback;
}


@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listview_item_food, parent, false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    holder.foods.setText(list.get(position).getName());
    holder.carbo.setText(list.get(position).getCarbohydrates());
    holder.protein.setText(list.get(position).getProtein());
    holder.fats.setText(list.get(position).getFats());

    //Get items from recyclerview when user clicks them. Then send them to FoodFragment
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mCallback != null)
                mCallback.onClick(list.get(position));
        }
    });
}


@Override
public int getItemCount() {
    return list.size();
}

class ViewHolder extends RecyclerView.ViewHolder {
    TextView foods, carbo, fats, protein;

    public ViewHolder(View itemView) {
        super(itemView);

        carbo = itemView.findViewById(R.id.carbo);
        protein = itemView.findViewById(R.id.protein);
        fats = itemView.findViewById(R.id.fats);
        foods = itemView.findViewById(R.id.food);
    }
}
}