Вызывает ли notifydatasetchanged onCreateViewHolder при использовании RecyclerView
Я хочу использовать переключатель для переключения между двумя разными представлениями, но с помощью того же RecyclerView
. В принципе, как только вы переключаетесь, я хочу RecyclerView
адаптер для вызова onCreateViewHolder()
но на этот раз он будет использовать разных файл пункт "макет".
тут notifydatasetchanged()
заставить адаптер перестроить себя? Или есть другой способ?
5 ответов
мне нужно было иметь два типа на View
s на моем 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
адаптер вынужден выбросить все созданные виды, и опять заново все.
удалить и обновить макет в 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 это сработало! если у вас есть лучшее решение, то удачи и поделиться им с нами. не забудьте сделать глобальную переменную "статической":)