При изменениях в 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*/}
}