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);

он отлично работает. Надеюсь, это помогло.