java - 如何更新已删除所有数据的recyclerview
问题描述
我正在从 SQL 迁移到 ORM Room。我遵循了一个教程,它通常可以插入数据,但是当我删除一个项目时它并没有消失。我必须打开和关闭应用程序才能显示它已经消失。
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();
}
解决方案
从适配器的数据集中删除项目,然后调用adapter.notifyItemRemoved(position)
推荐阅读
- python - 如何在无需安装 python 的情况下向用户分发 aa python 脚本
- matlab - 如何在 MatLab 中使用 ode45 修复分配错误(ode45 函数的第 488 行)
- android - 在 Android WebView 中访问 HTTP 响应标头
- perl - 如何使用 Sed 或 Perl 根据字符串的第二列号以降序方式对给定的文本文件进行排序
- c - 如何添加两个数组以产生第三个?
- class - 我怎样才能让这个调度电话工作?
- javascript - e.preventDefault() 不适用于表单提交
- entity-framework-core - 使用原始 SQL 更改数据库内容会导致 EntityFramework 上下文不同步
- php - 如何从所有网站页面执行搜索?
- node.js - 在 node-expat@2.3.17 安装脚本失败 - 任何 NPM 安装都会发生