@avkend

CardView & RecyclerView & Fragment, как в адаптере реализовать фрагмент?

Здравствуйте, исходные данные.
Стандартное меню DrawerLayout & NavigationView, к пунктам меню привязаны фрагменты, которые отображаются в FrameLayout.
Фрагмент отображаемый в FrameLayout состоит из CardView в связке с RecyclerView. Связку между ними осуществляет адаптер который наследуется от RecyclerView.Adapter с указанием класса, который будет хранить ссылки на виджеты элемента списка, т.е. класса, реализующего ViewHolder. Также есть слушатель, который отвечает за обработку щелчка по CardView.

Как можно в этом слушателе реализовать замену в FrameLayout, фрагмента с CardView на другой фрагмент? Чтобы CardView менялся на фрагмент в FrameLayout, по которому кликнули.

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ContentViewHolder> {

    public static class ContentViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        CardView cv;
        TextView cvTitle;
        TextView cvContent;
        ImageView cvPhoto;

        public ContentViewHolder(View itemView) {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.cv);
            cvTitle = (TextView) itemView.findViewById(R.id.text_title);
            cvContent = (TextView) itemView.findViewById(R.id.text_content);
            cvPhoto = (ImageView) itemView.findViewById(R.id.text_photo);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            switch (getAdapterPosition()) {
                case 0:

                    break;
                case 1:

                    break;
                case 2:

                    break;
            }
            Log.i("RecyclerView", "Вы щёлкнули на позиции " + getAdapterPosition());
        }
    }

    List<CardContent> mCardContents;
   
    public RVAdapter(List<CardContent> mCardContents) {
        this.mCardContents = mCardContents;
    }
   
    @Override
    public int getItemCount() {
        return mCardContents.size();
    }

    @Override
    public ContentViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardview, viewGroup, false);
        ContentViewHolder pvh = new ContentViewHolder(v);

        return pvh;
    }
    @Override
    public void onBindViewHolder(ContentViewHolder contentViewHolder, int i) {
        contentViewHolder.cvTitle.setText(mCardContents.get(i).title);
        contentViewHolder.cvContent.setText(mCardContents.get(i).content);
        contentViewHolder.cvPhoto.setImageResource(mCardContents.get(i).photoId);
        //Log.i("RecyclerView", "Позиция " + i);

    }
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }
}
  • Вопрос задан
  • 3531 просмотр
Пригласить эксперта
Ответы на вопрос 1
@kamiLLxiii
Android-разработчик
Слегка запутанно написано, но вроде понял. Вам надо по клику на элемент списка заменить текущий фрагмент?
Тогда вам стоит создать еще один интерфейс и использовать композицию. Реализацию этого интерфейса передавить в конструкторы RVAdapter и ContentViewHolder, а его самого создать на том уровне, где происходит должно происходить управление фрагментами. Например, так:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ContentViewHolder> {

    public interface OnItemClickListener{
       void onItemClicked(int position);
    }

    public static class ContentViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        CardView cv;
        TextView cvTitle;
        TextView cvContent;
        ImageView cvPhoto;
        OnItemClickListener cvClickListener;

        public ContentViewHolder(View itemView, OnItemClickListener clickListener) {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.cv);
            cvTitle = (TextView) itemView.findViewById(R.id.text_title);
            cvContent = (TextView) itemView.findViewById(R.id.text_content);
            cvPhoto = (ImageView) itemView.findViewById(R.id.text_photo);
            cvClickListener = clickListener;

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            cvClickListener.onItemClicked(getAdapterPosition());
            Log.i("RecyclerView", "Вы щёлкнули на позиции " + getAdapterPosition());
        }
    }

    List<CardContent> mCardContents;
   
    public RVAdapter(List<CardContent> mCardContents, OnItemClickListener itemClickListener) {
        this.mCardContents = mCardContents;
        this.mItemClickListener = itemClickListener;
    }
   
    @Override
    public int getItemCount() {
        return mCardContents.size();
    }

    @Override
    public ContentViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardview, viewGroup, false);
        ContentViewHolder pvh = new ContentViewHolder(v, mItemClickListener);

        return pvh;
    }
    @Override
    public void onBindViewHolder(ContentViewHolder contentViewHolder, int i) {
        contentViewHolder.cvTitle.setText(mCardContents.get(i).title);
        contentViewHolder.cvContent.setText(mCardContents.get(i).content);
        contentViewHolder.cvPhoto.setImageResource(mCardContents.get(i).photoId);
        //Log.i("RecyclerView", "Позиция " + i);

    }
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы