java - 将数据从 RecyclerView.Adapter 传递到片段 onClick
问题描述
我试图弄清楚如何将数据从 RecyclerView 中的单击项目获取到片段中的列表视图。我似乎无法弄清楚如何做到这一点,因为我无法让我的捆绑包工作。
我已经尝试过 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);
}
}
}
数据来自的 Fragment:
public class TrackingFragment extends Fragment {
DatabaseReference databaseReference;
ArrayList<FoodActivity> list;
RecyclerView recyclerView;
SearchView searchView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_tracking, container, false);
databaseReference = FirebaseDatabase.getInstance().getReference().child("foods");
recyclerView = view.findViewById(R.id.rv);
searchView = view.findViewById(R.id.searchFood);
return view;
}
@Override
public void onStart() {
super.onStart();
if(databaseReference != null){
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
list = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()){
list.add(ds.getValue(FoodActivity.class));
}
FoodAdapter adapter = new FoodAdapter(list);
recyclerView.setAdapter(adapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
if(searchView != null){
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
search(newText);
return true;
}
});
}
}
private void search(String str){
ArrayList<FoodActivity> searchList = new ArrayList<>();
for(FoodActivity object : list){
if(object.getName().toLowerCase().contains(str.toLowerCase())){
searchList.add(object);
}
}
FoodAdapter foodAdapter = new FoodAdapter(searchList);
recyclerView.setAdapter(foodAdapter);
}
}
以及它需要去的班级:
public class FoodFragment extends Fragment {
ImageButton addFood;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_food, container, false);
addFood = view.findViewById(R.id.addFood);
addFood.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction fr = getFragmentManager().beginTransaction();
fr.replace(R.id.fragment_container, new TrackingFragment());
fr.addToBackStack(null).commit();
}
});
return view;
}
}
解决方案
最简单的是将您需要的变量添加到您的活动中,使用 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();
推荐阅读
- python-3.x - 动态 Python 函数参数重新路由
- python - 使用 Pandas 为时间戳列表创建时隙
- python - 检查仍然在 Python 中连接的 telnet 会话的最佳且简单的方法是什么?
- angular - mime.types 不用于 angular 8 应用程序的 javascript 和 css 文件(使用 nginx:alpine dockerized)
- r - 为什么我的 SpatialPointsDataFrame 上的集群函数返回脚本越界错误?
- java - 如何循环遍历数组列表并显示没有 system.out.println 语句存储的元素?
- c# - 正则表达式模式不正确
- dns - LDAP 与 DNS 性能
- java - 在词法分析器规则中使用标记类型的积极前瞻
- date - 日期时间格式或编码