Как обновить recyclerview, который удалил все данные

Я перехожу с SQL на ORM Room. Я следил за учебником, обычно он работал с вставкой данных, но когда я удаляю элемент, он не исчезает. Мне нужно открыть и закрыть приложение, чтобы показать, что оно исчезло.

Учебник, которому я следовал, выглядит так: https://medium.com/@anujguptawork/note-making-application-using-sqlite-vs-room-part-2-using-room-becf92672e29

public class MainActivity extends AppCompatActivity implements Contrato.MainViewInterface {

@BindView(R.id.recyclerHome)
RecyclerView recyclerView;

private HomeAdapter adapter;
private List<Clientes> clientesList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    initViews();
    loadNotes();
}

private void initViews() {

    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setHasFixedSize(true);
}

private void loadNotes(){
    ClienteRepository.getInstance(this).getNotes(this);
}

@OnClick(R.id.fabAdicionar)
public void addNote(){
    Intent i = new Intent(MainActivity.this, AdicionarActivity.class);
    startActivity(i);
}

@OnClick(R.id.buttonDeletar)
public void buttonDeletar(){
    ClienteRepository.getInstance(this).deletarNotes();
}

@Override
public void onNotesLoaded(List<Clientes> clientesList) {
    clientesList = clientesList;

    if (clientesList.size() == 0){
        onDataNotAvailable();
    }else {
        adapter = new HomeAdapter(this, clientesList);
        recyclerView.setAdapter(adapter);
    }
}


@Override
public void onDataNotAvailable() {
    Toast.makeText(this,"Adicione uma nota",Toast.LENGTH_SHORT).show();
}

}

public class ClienteRepository {
private Context context;
private static ClienteRepository _instance;
private ClienteRoomDatabase db;

public static ClienteRepository getInstance(Context context) {
    if (_instance == null) {
        _instance = new ClienteRepository(context);
    }
    return _instance;
}

public ClienteRepository(Context context) {
    this.context = context;
    db = ClienteRoomDatabase.getClienteDatabase(context);
}

public void getNotes(final Contrato.MainViewInterface mainViewInterface) {
    db.clienteDAO().getAllClientes().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<List<Clientes>>() {
        @Override
        public void accept(List<Clientes> notes) throws Exception {
            mainViewInterface.onNotesLoaded(notes);
        }
    });
}

public void addNotes(final Contrato.AddNoteViewInterface addNoteViewInterface, final String nome) {
    Completable.fromAction(new Action() {
        @Override
        public void run() throws Exception {
            Clientes clientes = new Clientes(nome);
            db.clienteDAO().insert(clientes);
        }
    }).observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io()).subscribe(new CompletableObserver() {
        @Override
        public void onSubscribe(Disposable d) {
        }

        @Override
        public void onComplete() {
            addNoteViewInterface.onNoteAdded();
        }

        @Override
        public void onError(Throwable e) {
            addNoteViewInterface.onDataNotAvailable();
        }
    });
}

public void deletarNotes() {
    Completable.fromAction(new Action() {
        @Override
        public void run() throws Exception {
            db.clienteDAO().deleteAll();
        }
    }).observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io()).subscribe(new CompletableObserver() {
        @Override
        public void onSubscribe(Disposable d) {
        }

        @Override
        public void onComplete() {
        }

        @Override
        public void onError(Throwable e) {
        }
    });
}

}

@Dao
public interface ClienteDAO {

@Insert
void insert(Clientes clientes);

@Query("DELETE FROM table_clientes")
void deleteAll();

@Query("SELECT * FROM table_clientes ORDER BY name ASC")
Maybe<List<Clientes>> getAllClientes();
}

Я заметил одну вещь: вы создаете новый HomeAdapter каждый раз при загрузке заметок. Лучше оставить тот же HomeAdapter и просто сообщить адаптеру, что элементы были изменены. Вы можете сделать это с помощью таких методов, как notifyItemChanged/Removed/etc. Однако это требует, чтобы вы отслеживали, какие элементы на самом деле отличаются. Более простое решение - просто вызвать notifyDataSetChanged, но это может иметь некоторые нежелательные визуальные эффекты (например, элементы анимируются так, как будто они изменились, даже если они этого не сделали). ЛУЧШЕЕ решение - использовать DiffUtil, который сделает всю работу за вас.

fpsulli3 15.10.2018 01:34

И как я могу это исправить, не могли бы вы привести мне пример?

OliverDamon 15.10.2018 01:58

ListAdapter - это адаптер RecycleView, который вы можете создать в подклассе, который выполняет большую часть работы DiffUtil за вас. Вам просто нужно предоставить ItemCallback. В документации есть пример использования Room: developer.android.com/reference/android/support/v7/recyclerv‌ iew /…. Обратите внимание, как в этом примере они не создают новый адаптер каждый раз, когда список обновляется. Они просто вызывают submitList на существующем адаптере.

fpsulli3 15.10.2018 02:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
33
1

Ответы 1

Удалите элемент из набора данных адаптера, затем позвоните в adapter.notifyItemRemoved(position).

Другие вопросы по теме