Я недавно начал программировать в android, и у меня проблема с RecyclerView
и LiveData
:
, когда я удаляю или добавляю элемент в мою базу данных RoomDatabase, LiveData изменяется правильно и запускается мой наблюдатель. У меня есть элементы, которые можно проверить, но когда я удаляю или добавляю элемент в RecyclerView, они перезаписываются, и я теряю каждый отмеченный элемент. Я пробовал использовать DiffUtil
, но, к сожалению, неправильно понял его использование.
Я видел все руководства по yt, medium и StackOverflow, но каждый из них перезаписывает данные. Разве это не неэффективно, когда у меня n сложных предметов?
Есть предложения, как не потерять проверенную информацию?
Я не хочу сохранять проверенную информацию в roomDatabase, потому что при перезапуске приложения не должно быть отмеченных элементов.
Извлечение класса myPlace и объекта Room:
@Entity(tableName = "myPlaces")
public class MyPlace {
@PrimaryKey
@NonNull
private String place_id;
private String name;
private String reference;
@TypeConverters(GeometryConverter.class)
@ColumnInfo(name = "geometry")
@SerializedName("geometry")
private Geometry geometry;
private String vicinity;
@Ignore
private boolean checked;
@Ignore
private Bitmap image;
...
}
LiveData Observer:
...
LiveData<List<MyPlace>> liveData = favoriteViewModel.getFavoritePlaces();
liveData.observe(this, myPlaces -> {
recyclerView.setAdapter(myFavoritePlacesAdapter);
myFavoritePlacesAdapter.setFavoritePlaces(new ArrayList<>(myPlaces));
...
};
В моем адаптере:
@Override
public void onBindViewHolder(@NonNull final MyFavoritePlaceViewHolder holder,final int position) {
final MyPlace myPlace = favoritePlaces.get(holder.getAdapterPosition());
holder.bind(myPlace);
holder.place.setOnClickListener(v -> {
if((listener != null)){
holder.place.setChecked(myPlace.isChecked());
listener.onItemClick(holder.getAdapterPosition());
}
});
holder.place.setOnLongClickListener(v -> {
if (listener != null) {
myPlace.setChecked(!myPlace.isChecked());
holder.place.setChecked(myPlace.isChecked());
listener.onItemLongClick(position);
}
return true;
});