使用数据库表填充RecyclerView的方法有什么问题?

时间:2016-09-05 12:26:43

标签: android sqlite android-recyclerview recycler-adapter

在我编写下面的代码之前,我在这里搜索了如何使用数据库表填充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());
}

在我看来,它工作得很好,但后来我只是一个初学者。

那么,请问这个实现有什么问题,以及更好的方法是什么?

1 个答案:

答案 0 :(得分:2)

  

此实现有什么问题

您正在使用getBookDb()方法在主应用程序线程上执行数据库I / O.请不要在主应用程序线程上执行I / O.

一般来说,将Cursor转换为某种POJO的List并没有什么特别的错误。同样,将JSON转换为某种POJO的List并没有什么特别的错误。但是,理想情况下,如果您从中获得了一些有用的东西,那么您只能进行这种转换。您 进行转换只是为了在Cursor中使用RecyclerView