Не уведомляет, что выбранный вызов onCreateViewHolder при использовании RecyclerView

Я хочу использовать переключатель для переключения между двумя разными представлениями, но используя тот же RecyclerView. В принципе, как только вы переключаетесь, я хочу, чтобы адаптер RecyclerView вызывал onCreateViewHolder, но на этот раз он будет использовать другой файл макета. Может ли notifydatasetchanged() перестроить адаптер? Или есть другой способ?

Спасибо заблаговременно.

Ответ 1

Мне нужно было иметь два типа на View на моем RecyclerView Adapter, а для режима "обычный" и один для режима с несколькими выборами.

Итак, вы можете переопределить getItemViewType, чтобы заставить Adapter вызвать ваш onCreateViewHolder для всех представлений.

Добавьте это в код Adapter:

public void setActionMode(ActionMode actionMode) {
    this.actionMode = actionMode;
    notifyDataSetChanged();
}

@Override
public int getItemViewType(int position) {
    return (actionMode == null ? 0 : 1);
}

Добавьте это в ViewHolder:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view;
    if (viewType == 0) {
        view = inflater.inflate(R.layout.layout_1, parent, false);
    } else {
        view = inflater.inflate(R.layout.layout_2, parent, false);
    }
    ...
}

Поскольку вы возвращаете другой ViewType, когда в ActionMode, Адаптер вынужден отбросить все созданные просмотры и снова воссоздать все.

Ответ 2

notifyDataSetChanged() вызов onBindViewHolder() при использовании RecyclerView

Ответ 3

Чтобы удалить и обновить макет в RecyclerView, вы можете позвонить

mRecyclerView.removeView(view);

или

mRecyclerView.removeViewAt(position);

после удаления объекта в вашем наборе данных

Ответ 4

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