Android обновляющий адаптер работает после поворота снова устройство
Этот код отлично работает, когда я добавляю некоторые данные в "Модель списка" и восстанавливаю сохраненные данные на устройстве ротации, к сожалению, после восстановления данных и установите для этого параметра model
внутри onRestoreInstanceState
, после добавления других данных к этому, адаптер не смог обновиться с новыми добавленными данными, источник данных в адаптере после обновления может быть обновлен, но адаптер не может их знать, я использую привязку модели данных MVVM
и ищу больше времени об этой проблеме. я не может решить это.
У Rhat есть простой наконечник, который после поворота снова, мой адаптер может обновляться со всеми добавленными данными, которые адаптер не обновляет с ними.
public class ActivityRegister extends BaseActivities{
private List<RobotViewModel> model = new ArrayList<>();
...
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelable("model", Parcels.wrap(model));
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle outState) {
model = Parcels.unwrap(outState.getParcelable("model"));
adapter.setData(model);
adapter.notifyItemInserted(model.size() - 1);
binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);
}
добавить к model
метод:
@Override
public void clickOnSendCommandToRobot() {
RobotViewModel temp = new RobotViewModel();
temp.setMessage("message");
temp.setCommand(true);
model.add(temp);
adapter.notifyItemInserted(model.size() - 1);
binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);
}
Мой класс адаптера:
public class RobotMessagesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<RobotViewModel> list;
private LayoutInflater inflater;
public RobotMessagesAdapter(List<RobotViewModel> robotViewModels) {
this.list = robotViewModels;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (inflater == null) {
inflater = LayoutInflater.from(parent.getContext());
}
if (viewType == SV.RobotMessageType.SENT_BY_USER.ordinal()) {
return new UserViewHolder(UserMessagesDataBinding.inflate(inflater, parent, false));
} else {
return new RobotViewHolder(RobotDataBinding.inflate(inflater, parent, false));
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case 0:
((UserViewHolder) holder).bind(list.get(position));
break;
case 1:
((RobotViewHolder) holder).bind(list.get(position));
break;
}
}
...
public void setData(List<RobotViewModel> data) {
Log.e("data size ", data.size() + "");
list.clear();
list.addAll(data);
}
}
Мне интересно, почему этот код работает нормально:
@Override
protected void onRestoreInstanceState(Bundle outState) {
model = Parcels.unwrap(outState.getParcelable("model"));
adapter.setData(model);
adapter.notifyItemInserted(model.size() - 1);
binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);
RobotViewModel temp = new RobotViewModel();
temp.setMessage("message");
temp.setCommand(true);
model.add(temp);
adapter.notifyItemInserted(model.size() - 1);
binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);
}
без проблем и после перемещения этих строк:
RobotViewModel temp = new RobotViewModel();
temp.setMessage("message");
temp.setCommand(true);
model.add(temp);
adapter.notifyItemInserted(model.size() - 1);
binding.registerRobot.scrollToPosition(adapter.getItemCount() - 1);
другому методу, который не работает: |
Мой ведущий:
public class ActivityRegisterPresenter {
private ActivityRegisterContract view;
public ActivityRegisterPresenter(ActivityRegisterContract mView) {
view = mView;
}
...
}
и мой ViewModel:
public class ActivityRegisterViewModel extends BaseObservable {
private String readContactPermission;
private String getMessages;
public ActivityRegisterViewModel() {
}
@Bindable
public String getReadContactPermission() {
return readContactPermission;
}
public void setReadContactPermission(String readContactPermission) {
this.readContactPermission = readContactPermission;
notifyChange();
}
public String getGetMessages() {
return getMessages;
}
public void setGetMessages(String getMessages) {
this.getMessages = getMessages;
}
}
ИСТОЧНИК КОДА ЗДЕСЬ
проблемы находятся в clickOnRegisterMobileNumber
и clickOnSendCommandToRobot
методах
Ответы
Ответ 1
Моя проблема решена,
после добавления этой ниже строки в манифест для конкретной активности, где вы устанавливаетеAdapter
android:configChanges="screenSize|orientation|screenLayout"
Но он вернет лучший вид, если вы создадите как портретную, так и ландшафтную макеты или запускаете приложение только в одном из этих режимов.
Ответ 2
The main reason is that, because you called set-data and that method did not immediately notify that the data set was changed, therefore it was not ware.
public void setData(List<RobotViewModel> data) {
Log.e("data size ", data.size() + "");
list.clear();
list.addAll(data);
}
public void setData(List<RobotViewModel> data) {
Log.e("data size ", data.size() + "");
list.clear();
notifyDataSetChanged(); //here,to signal change occurred.
list.addAll(data);
notifyDataSetChanged(); //here,to signal change occurred.
}
should probably get into the habit of notifying changes on the spot.
Основная проблема заключается в том, что вы никогда не уведомляли об изменениях, которые вы сделали, вы ее очистили, но вы никогда не говорили об этом, знаете ли вы, что адаптер не знает, также вы добавили свежие данные с помощью addAll
, но вы все равно сделали не уведомлять об этом.
Ответ 3
Я пробовал ваш код, и он работает отлично с несколькими обновлениями.
Когда вы выполняете это действие
model.add(temp);
adapter.notifyItemInserted(model.size() - 1);
Вы предполагаете сохранение связи между объектной моделью и источником данных адаптера.
Это предположение неверно, на самом деле, если вы просто замените код выше на
model.add(temp);
adapter.setData(model);
adapter.notifyItemInserted(model.size() - 1);
он отлично работает.
Надеюсь, это помогло.