Recyclerview + Content provider + CursorLoader

Abd*_*man 20 sqlite android cursor android-contentprovider android-recyclerview

我在SQLite数据库中有一些数据.我有一个内容提供程序,它将从数据库中获取数据.现在的问题是如何实现cursorLoader与recyclerview一起工作?

此外,任何人都可以解释为什么我们需要将数据从游标传输到对象以显示在listview/recyclerview中而不是直接从游标中显示?

例如,在自定义cursorAdapter类中,

Person person = new Person(cursor.getString(cursor.getColumnIndexOrThrow(PERSON_NAME)));
textview.setText = person.getName();
Run Code Online (Sandbox Code Playgroud)

要么

textview.setText = cursor.getString(cursor.getColumnIndexOrThrow(PERSON_NAME));
Run Code Online (Sandbox Code Playgroud)

以上哪种方法比较好?

在过去,我们曾经有listview和gridview,现在看来它们被合并成为recyclerview.那么,我如何实现基于网格的Recyclerview?

luc*_*ler 4

一般来说,您应该尝试将视图和数据职责分开。因此,您需要提前从数据库中获取所有对象,然后设置一个适配器,如下所示:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
    private final List<Person> objectList = new ArrayList<>();

    @Override
    public CustomAdapter.ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
        final LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        return new ViewHolder(layoutInflater.inflate(R.layout.adapter_item, parent, false));
    }

    @Override
    public void onBindViewHolder(final CustomAdapter.ViewHolder holder, final int position) {
        holder.bindItem(objectList.get(position));
    }

    // Set the persons for your adapter
    public void setItems(final List<Person> persons) {
        objectList.addAll(persons);
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return objectList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private final TextView mTextViewTitle;
        private Object mObject;

        public ViewHolder(final View itemView) {
            super(itemView);
            mTextViewTitle = (TextView) itemView.findViewById(R.id.view_item_textViewTitle);                
            mTextViewTitle.setText(mObject.getText());
        }

        private void bindItem(@NonNull final Person object) {
            mObject = object;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以通过以下方式将适配器绑定到 RecyclerView:

final CustomAdapter adapter = new CustomAdapter();
adapter.setItems(mPersons);
mRecyclerView.setAdapter();
Run Code Online (Sandbox Code Playgroud)

回答你的第二个问题(“过去,我们曾经有listview和gridview,现在似乎它们结合起来成为recyclerview。那么,我如何实现基于网格的recyclerview?”):

将 LayoutManager 绑定到 RecyclerView 时,您可以决定采用哪一个:

final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(layoutManager);
Run Code Online (Sandbox Code Playgroud)

或者

final GridLayoutManager layoutManager = new GridLayoutManager(this, COLUMN_SPAN_COUNT);
mRecyclerView.setLayoutManager(layoutManager);
Run Code Online (Sandbox Code Playgroud)

有几个布局管理器。在这里了解更多信息。

更新:您不必提前加载所有项目,只需将 setItems 重命名为 addItems 就可以了