Как не перезаписать список RecyclerView при добавлении элемента в базу данных комнаты - PullRequest
0 голосов
/ 28 мая 2020

Я недавно начал программировать в 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;
        });
...