Это вложенное RecyclerView
в другом RecyclerView
? Обновляется ли он после изменения конфигурации (поворот экрана)?
Я неоднократно встречался с одной и той же ошибкой, просмотр при повторном использовании не обновляет пользовательский интерфейс при добавлении новых элементов, хотя все действия адаптера выполнены. Я использую обходной путь здесь: mRecyclerView.scrollBy(0,1)
, попробуйте позвонить сразу после notifyDataSetChanged()
вызова.
Как на самом деле ведет себя RecyclerView
? Это показывает все предметы? Все ли они обновлены с одинаковой информацией? Или это только последний элемент, который обновляется?
Редактировать
Похоже, проблема не в том, что RV не обновляет пользовательский интерфейс, а в том, как привязка данных и как вы используете Это. Это только последний элемент, который обновляется правильно?
Проблема в том, что ваш viewServersFragmentItemBinding
объявлен в вашем классе адаптера, но он должен быть объявлен и сохранен в классе видоискателя (также является окончательным). Это означает, что после вызова всех ваших методов onCreateViewHolder
сохраняется только привязка данных последнего держателя представления, и все последующие onBindViewHolder
методы вызывают bindView
, передавая ссылку на привязку последнего viewholder
.
RecyclerView
перерабатывает видоискателей, что означает, что он не воссоздает их при изменении данных, а представления создаются только при первом вызове - поэтому он работает, когда вы снова открываете приложение или поворачиваете экран - onCreateViewHolder
и onBindViewHolder
вызываются по одной для каждой записи в вашем списке, правильное представление привязки.
Затем, когда данные изменяются и вы вызываете onDataSetChanged()
, метод onCreateViewHolder
никогда не вызывается, потому что у вас уже есть все ваши ViewHolder
s, вызываются только onBindViewHolder
методы. Дело в том, что они вызывают bindView
с той же ссылкой на привязку данных последнего элемента.
Проверьте артикул https://medium.com/androiddevelopers/android-data-binding-recyclerview-db7c40d9f0e4
Привязка данных создается в onCreateViewHolder
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, viewType, parent, false);
return new MyViewHolder(binding);
}
public void onBindViewHolder(MyViewHolder holder, int position) {
Object obj = getObjForPosition(position);
holder.bind(obj);
}
Но хранятся и доступны только в ViewHolder
public class MyViewHolder extends RecyclerView.ViewHolder {
private final ViewDataBinding binding;
public MyViewHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void bind(Object obj) {
binding.setVariable(BR.obj, obj);
binding.executePendingBindings();
}
}