При изменениях в LiveData теряется один item в reccyclerView, хотя List не уменьшается

Ситуация: в recyclerView при открытии активити загружается 4 items, после чего если я клюкаю на любой, он должен удаляться и добавляться новый в конец списка (см. removeAndAddPerson() во ViewModel). Проблема в том, что в ливдатный список все благополучно доабвляется, но во вью после первого вызова метода остается только три айтема (4й есть в LiveData<List<...>>, но не отображается во вью.) То есть Object добавлен, и если кликать дальше, например на первый айтем, то ёй исчезает, а 4й становится третьим и становится виден во Вью. Добавляется новый 4й, который снова не виден. Далее вью уже не уменьшается, то есть баг происходит только при первом клике. В чем может быть проблема и как решить?

In Activity:

public class RecyclerActivity extends AppCompatActivity {

    private PersonViewModel myRecyclerViewModel;
    private RecyclerAdapter myRecyclerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        RecyclerView myRecyclerView = findViewById(R.id.recycler_view);
        myRecyclerAdapter =
                new RecyclerAdapter(new RecyclerAdapter.MudakRecyclerDiff(), this);
        myRecyclerView.setAdapter(myRecyclerAdapter);
        myRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        myRecyclerView.setItemAnimator(null);

        myRecyclerViewModel = new ViewModelProvider(this,
                ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication()))
                .get(PersonViewModel.class);
        myRecyclerViewModel.getListLivedata().observe(this, personList -> myRecyclerAdapter.submitList(personList));
    }

    @Override
    public void onItemClick(int position) {
        Log.d(TAG, "onItemClick: called for " + myRecyclerAdapter.getPersonAt(position).getName() + ", at the position " + position);
        myRecyclerViewModel.removeAndAddPerson(myRecyclerAdapter.getPersonAt(position));
    }
}

In ViewModel:

public class PersonViewModel extends AndroidViewModel {

    private PersonRepository mRepository;
    private CompositeDisposable composite = new CompositeDisposable();
    private Single<List<Person>> mThreePersons;
    private Single<Person> m1Person;
    private ArrayList<Person> mList = new ArrayList<>();
    private MutableLiveData<List<Person>> mListLivedata = new MutableLiveData<>();

    public PersonViewModel(@NonNull Application application) {
        super(application);
        mRepository = new PersonRepository(application);

        mThreePersons = mRepository.getThreePersons();
        m1Person = mRepository.get1Person();

        mThreePersons.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new SingleObserver<List<Person>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "onSubscribe(Disposable d): called");
                        composite.add(d);
                    }

                    @Override
                    public void onSuccess(List<Person> people) {
                        Log.d(TAG, "onSuccess: called");
                        mList.addAll(people);
                        mListLivedata.setValue(mList);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError: called");
                        Toast.makeText(application, "NO DATA", Toast.LENGTH_SHORT).show();
                    }
                });
    }

    LiveData<List<Person>> getListLivedata() {
        return mListLivedata;
    }

    public void removeAndAddPerson(Person person) {
        mList = new ArrayList(mList); // create a new list with same contents
        mList.remove(person); // remove the item from the new list.
        Log.d(TAG, person.getName() + " removed from List: called");
        m1Person.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new SingleObserver<Person>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        composite.add(d);
                    }

                    @Override
                    public void onSuccess(Person person) {
                        mList.add(person);
                        Log.d(TAG, person.getName() + " added: called");
                    }

                    @Override
                    public void onError(Throwable e) {
                    }
                });
        Log.d(TAG, String.valueOf(mList));
        mListLivedata.setValue(mList);
    }
}

In Adapter:

public class RecyclerAdapter extends ListAdapter<Person, RecyclerAdapter.RecyclerViewHolder> {
    private OnItemListener mOnItemListener;
    public interface OnItemListener {void onItemClick(int position);}
    protected RecyclerAdapter(@NonNull DiffUtil.ItemCallback<Person> diffCallback, OnItemListener onItemListener) {
        super(diffCallback);
        mOnItemListener = onItemListener;
    }

    public class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        // declaring variables

        public RecyclerViewHolder(@NonNull View itemView, OnItemListener onItemListener) {
            super(itemView);
            //inititalizing variables
            this.onItemListener = onItemListener;
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {onItemListener.onItemClick(getAdapterPosition());}
    }

    public Person getPersonAt(int position) {return getItem(position);}

    @NonNull
    @Override
    public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recycler_simple_item, parent, false);
        return new RecyclerAdapter.RecyclerViewHolder(view, mOnItemListener);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {/*methods*/}
}

Ответы (0 шт):