【发布时间】:2020-04-07 16:44:18
【问题描述】:
我在我的应用程序中使用房间数据库。该应用程序在所有书籍、家庭书籍和图书馆书籍三个类别下显示书籍。该应用程序根据用户选择显示书籍数据。一切正常,该应用程序显示正确的类别书籍,但是当用户从任何类别中删除一本书时,应用程序和列表会刷新,然后有时应用程序会显示错误的数据,这意味着如果用户正在查看家庭图书类别下的图书并且他删除了一本书,那么应用程序会向他显示随机图书而不是显示他选择的图书家庭书籍。 // 这就是我加载数据的方式:
public void loadBooks(){
if(booksType==1){
mBookViewModel.getAllBooks().observe(this, new Observer<List<Books>>() {
@Override
public void onChanged(@Nullable final List<Books>books) {
adapter.setBooks(books);
}
});
}
if(booksType==2){
mBookViewModel.getHomeBooks().observe(this, new Observer<List<Books>>() {
@Override
public void onChanged(@Nullable final List<Books>books) {
// Update the cached copy of the words in the adapter.
adapter.setBooks(books);
}
});
}
if(booksType==3){
mBookViewModel.getLibrarayBooks().observe(this, new Observer<List<Books>>() {
@Override
public void onChanged(@Nullable final List<Books>books) {
// Update the cached copy of the words in the adapter.
adapter.setBooks(books);
}
});
}
calculateSum();// calculating sum of values of a column.
}
public void calculateSum(){
double total=mBookViewModel.getBookSum();
}
// This how I am deleting a book:
public void delete(Books book){
int rowsDeleted = mBookViewModel.deleteBook(book);
loadBooks(); //have to call this method as I am doing other stuff also.Like calculating the sum of other integer fields.
// suppose user is viewing Home Books(means bookType==2) after this call instead of showing user Home Books the app shows him any random list of books.It does not happen always but after user deletes five to six books continuously and fast.
}
// My View Model:
LiveData<List<Books>> getAllBooks() {return mRepository.getAllBooks(); }
LiveData<List<Books>> getHomeBooks() {return mRepository.getHomeBooks(); }
LiveData<List<Books>> getLibraryBooks() {return mRepository.getLibraryBooks(); }
double getBookSum() {return mRepository.getBookSum(); }
// Repository:
LiveData<List<Books>> getallBooks() {
try {
return new getAllBooksAsyncTask(mBooksDao).execute().get();
} catch (ExecutionException e) {
e.printStackTrace();
return null;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
private static class getAllBooksAsyncTask extends AsyncTask<Void, Void, LiveData<List<Books>>> {
private BooksDao mAsyncTaskDao;
getAllBooksAscAsyncTask(BooksDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected LiveData<List<Books>> doInBackground(Void... voids) {
return mAsyncTaskDao.getAllBooks();
}
}
LiveData<List<Books>> getallBooks() {
try {
return new getAllBooksAsyncTask(mBooksDao).execute().get();
} catch (ExecutionException e) {
e.printStackTrace();
return null;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
private static class getHomeBooksAsyncTask extends AsyncTask<Void, Void, LiveData<List<Books>>> {
private BooksDao mAsyncTaskDao;
getHomeBooksAscAsyncTask(BooksDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected LiveData<List<Books>> doInBackground(Void... voids) {
return mAsyncTaskDao.getHomeBooks();
}
}
LiveData<List<Books>> getallBooks() {
try {
return new getAllBooksAsyncTask(mBooksDao).execute().get();
} catch (ExecutionException e) {
e.printStackTrace();
return null;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
private static class getLibraryBooksAsyncTask extends AsyncTask<Void, Void, LiveData<List<Books>>> {
private BooksDao mAsyncTaskDao;
getLibraryBooksAscAsyncTask(BooksDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected LiveData<List<Books>> doInBackground(Void... voids) {
return mAsyncTaskDao.getLibraryBooks();
}
}
public double getBookSum() {
try {
return new getBookSumAsyncTask(mBookDao).execute().get();
} catch (ExecutionException e) {
e.printStackTrace();
return 0;
} catch (InterruptedException e) {
e.printStackTrace();
return 0;
}
}
private static class getBookSumAsyncTask extends AsyncTask<Void, Void, Double> {
private BookDao mAsyncTaskDao;
getBookSumAsyncTask(BookDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Double doInBackground(Void... voids) {
return mAsyncTaskDao.getBookSum();
}
}
// Dao:
@Query("SELECT * FROM books WHERE type = 1 ")
LiveData<List<Books>> getAllBooks();
@Query("SELECT * FROM books WHERE type = 2 ")
LiveData<List<Books>> getHomeBooks();
@Query("SELECT * FROM books WHERE type = 3 ")
LiveData<List<Books>> getLibraryBooks();
@Query("SELECT SUM(pages) FROM books ")
double getBookSum();
// Recycler View:
@Override
public void onBindViewHolder(@NonNull booksRecyclerAdapter.BookViewHolder holder, int position) {
if (mBookss != null) {
Books current = mBooks.get(position);
String name = current.getName();
holder.nameTextView.setText(name);
}
}
void setBooks(List<Books> book){
mBooks = book;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if (mBooks != null)
return mBooks.size();
else return 0;
}
public Books getBookAtPosition (int position) {
return mBooks.get(position);
}
我尝试添加 adapter.notifyDataSetChanged() 和 adapter.notifyItemRemoved(position);但它不起作用。另外,如果我的代码有问题,那么为什么它并不总是发生,它有时通常在连续删除五六个项目后发生。 非常感谢任何帮助。
【问题讨论】:
-
您好,在您删除一本书,然后关闭并重新打开您的应用程序后会发生什么,它是否显示正确的列表而没有删除的书或仍然有问题?
-
当我关闭并重新打开应用程序时,应用程序会显示正确的数据。只有当用户根据 bookType 的值过滤数据然后编辑或删除一本书时,应用程序才会显示用户之前选择的 bookType 而是显示随机数据。而且它并不总是发生。我认为在重新加载数据时应用程序没有正确读取 bookType 的值。
标签: android android-recyclerview android-room android-viewmodel