在我编写下面的代码之前,我在这里搜索了如何使用数据库表填充recyclerview。我遇到的所有答案实际上都在说同样的事情" RecyclerView没有像listview这样的CursorAdapter。写一个扩展CursorRecyclerViewAdapter等"
的adpater然而,我发现通过迭代光标并将数据放入数组中,我能够像使用json和html数据一样从数据库中填充recyclerview。
所以这些是我的代码:
BookItem
public class BookItem {
private String title;
private String imageUrl;
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
BookAdapter
public class BookAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
List<BookItem> mBookItems;
public BookAdapter(List<BookItem> bookItems, Context context) {
mBookItems = bookItems;
mContext = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.book_item, parent, false);
return new BookViewHolder(view);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
BookItem bookItem = mBookItems.get(position);
ImageLoader imageLoader = VolleyRequest.getInstance(mContext).getImageLoader();
imageLoader.get(bookItem.getImageUrl(), ImageLoader.getImageListener(((BookViewHolder) holder).thumbNail,
R.drawable.shop_book_thumb, R.drawable.shop_book_thumb), 120, 120, ImageView.ScaleType.CENTER_INSIDE);
((BookViewHolder) holder).thumbNail.setImageUrl(bookItem.getImageUrl(), imageLoader);
((BookViewHolder) holder).mTitle.setText(bookItem.getTitle());
}
@Override
public int getItemCount() {
return mBookItems.size();
}
public class BookViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.book_item_thumb) NetworkImageView thumbNail;
@BindView(R.id.book_item_title) TextView mTitle;
public BookViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
BookFragment的一部分
private void getBookDb () {
Log.d(TAG, "getBookDb called");
mDatabase = mBookHelper.getWritableDatabase();
Cursor cursor = mDatabase.rawQuery("SELECT * FROM " + BookEntry.NAME, null);
if (cursor != null && cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
BookItem bookItem = new BookItem();
String title = cursor.getString(cursor.getColumnIndex(BookEntry.TITLE));
String imageUrl = cursor.getString(cursor.getColumnIndex(BookEntry.IMAGE_URL));
bookItem.setTitle(title);
bookItem.setImageUrl(imageUrl);
mBookItems.add(bookItem);
cursor.moveToNext();
}
} else {
Log.d(TAG, "Database is empty");
emptyDataLayout.setVisibility(View.VISIBLE);
}
if (cursor != null) {
cursor.close();
}
mDatabase.close();
mBookAdapter.notifyItemRangeChanged(0, mBookAdapter.getItemCount());
}
在我看来,它工作得很好,但后来我只是一个初学者。
那么,请问这个实现有什么问题,以及更好的方法是什么?
答案 0 :(得分:2)
此实现有什么问题
您正在使用getBookDb()
方法在主应用程序线程上执行数据库I / O.请不要在主应用程序线程上执行I / O.
一般来说,将Cursor
转换为某种POJO的List
并没有什么特别的错误。同样,将JSON转换为某种POJO的List
并没有什么特别的错误。但是,理想情况下,如果您从中获得了一些有用的东西,那么您只能进行这种转换。您 进行转换只是为了在Cursor
中使用RecyclerView
。