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