Вызывает ли notifydatasetchanged onCreateViewHolder при использовании RecyclerView

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

тут notifydatasetchanged() заставить адаптер перестроить себя? Или есть другой способ?

5 ответов


мне нужно было иметь два типа на Views на моем RecyclerView Adapter также, один для "регулярного" режима и один для режима multi-select.

таким образом, вы можете переопределить getItemViewType чтобы заставить адаптер вызвать ваш 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 адаптер вынужден выбросить все созданные виды, и опять заново все.


notifyDataSetChanged() звонки onBindViewHolder() в случае RecyclerView


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

mRecyclerView.removeView(view);

или

mRecyclerView.removeViewAt(position);

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


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


Я потратил более 6 часов на этот вопрос без какого-либо успеха. Наконец-то!!! Я установил глобальную переменную в адаптере и должен был настроить ее каждый раз, когда я переключал представление из списка в сетку (в моем случае). самое смешное, этот approauch был там, но я забыл это сделать как статические!! Поэтому мое решение может быть связано с вашим, просто попробуйте и надейтесь, что оно сработает.

public static int mCurrentViewType;

затем переопределите getItemType ()

  @Override
    public int getItemViewType(int position) {

       return mCurrentViewType;


    }

мой toggleItemViewType метод:

public void toggleItemViewType () {
        if (mCurrentViewType == LIST_ITEM){
            mCurrentViewType = GRID_ITEM;
        } else {
            mCurrentViewType = LIST_ITEM;
        }
    }

Я получаю доступ к переменной из разных классов, что неправильно, но сейчас и ради проблемы onCreateViewHolder это сработало! если у вас есть лучшее решение, то удачи и поделиться им с нами. не забудьте сделать глобальную переменную "статической":)