Передача данных из RecyclerView.Adapter для фрагментации по клику - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь выяснить, как получить данные из нажатого элемента в RecyclerView в просмотр списка во фрагменте.Кажется, я не могу понять, как это сделать, так как не могу заставить свой пакет работать.

Я пробовал различные решения, предлагаемые здесь, на Stackoverflow, но ни одно из них не сработало.Мне удалось получить информацию из обзора переработчика, но я застрял, пытаясь выяснить, как я могу передать ее фрагменту.Может ли кто-нибудь помочь мне?

Класс адаптера:

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

Фрагмент, откуда поступают данные:

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

}

Ответы [ 3 ]

0 голосов
/ 28 марта 2019

Самое простое - добавить переменные, которые вам нужны, в вашу деятельность, установить их значения с помощью 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();

0 голосов
/ 28 марта 2019

Добавьте интерфейс к вашему адаптеру следующим образом

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);
    }
}
}
0 голосов
/ 28 марта 2019

Чтобы получить данные из FoodAdapter в TrackingFragment, вы можете добавить TrackingFragment (или интерфейс, который он реализует, в идеале) в качестве параметра в конструктор FoodAdapter, а затем использовать этот экземпляр для пересылки ваших кликов ViewHolder в TrackingFragment для обработки.

Чтобы получить данные из TrackingFragment в FoodFragment, используйте шаблон setTargetFragment / onActivityResult для связи фрагмента <-> фрагмента. Этот ответ имеет пример: https://stackoverflow.com/a/13733914/3238938

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...