【问题标题】:Recyclerview adapter with CursorAdapter带有 CursorAdapter 的 Recyclerview 适配器
【发布时间】:2016-01-29 12:30:36
【问题描述】:

我正在尝试使用CusrorAdapterRecyclerview 实现适配器,如下面的解决方案here 中所建议的那样。

我是 Android 新手,我不太清楚应该如何覆盖 CursorAdapter 的 newView 方法和 bindView 方法。另外我猜我的适配器将在ViewHolder 中有多个变量而不是一个(View v1),因为我的布局文件中有几个textViews,但我只是不知道它们如何都适合代码。

public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.ViewHolder {

// PATCH: Because RecyclerView.Adapter in its current form doesn't natively support
// cursors, we "wrap" a CursorAdapter that will do all teh job for us
CursorAdapter mCursorAdapter;
Context mContext;

public MyRecyclerAdapter(Context context, Cursor c) {
    mContext = context;
    mCursorAdapter = new CursorAdapter(mContext, c, 0) {

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            // Inflate the view here
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            // Binding operations

        }
    };
}

public static class ViewHolder extends RecyclerView.ViewHolder{
    View v1;
    public ViewHolder(View itemView) {
        super(itemView);
        v1 = itemView.findViewById(R.id.v1);
    }
}

@Override
public int getItemCount() {
    return mCursorAdapter.getCount();
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    // Passing the binding operation to cursor loader
    mCursorAdapter.bindView(holder.itemView, mContext, mCursorAdapter.getCursor());

}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // Passing the inflater job to the cursor-adapter
    View v = mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent);
        return new ViewHolder(v);
    }
}

【问题讨论】:

    标签: android cursor android-cursoradapter android-recyclerview


    【解决方案1】:

    虽然我不了解它的详细工作原理,但我还是设法让它工作起来。基本上我添加了一个ViewHolder 变量作为类变量并更改了部分代码。当您在名为 row.xml 的布局文件中有 2 个 TextView 项目(namedate)时,解决方案看起来像这样:

    public class MyRecyclerAdapter extends Adapter<MyRecyclerAdapter.ViewHolder>{
    
        // PATCH: Because RecyclerView.Adapter in its current form doesn't natively support
        // cursors, we "wrap" a CursorAdapter that will do all teh job for us
        private CursorAdapter mCursorAdapter;
        private Context mContext;
        private ViewHolder holder;
    
        public MyRecyclerAdapter(Context context, Cursor c) {
            mContext = context;
            mCursorAdapter = new CursorAdapter(mContext, c, 0) {
    
                @Override
                public View newView(Context context, Cursor cursor, ViewGroup parent) {
                    // Inflate the view here
                    View v = LayoutInflater.from(context)
                        .inflate(R.layout.row_rv, parent, false);
                    return v;
                }
    
                @Override
                public void bindView(View view, Context context, Cursor cursor) {
                    // Binding operations
                    String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
                    String date = cursor.getString(cursor.getColumnIndexOrThrow("date"));
    
                    holder.tvName.setText(name);
                    holder.tvDate.setText(date);
                }
            };
        }
    
        public static class ViewHolder extends RecyclerView.ViewHolder{
            public TextView tvName;
            public TextView tvDate;
    
            public ViewHolder(View itemView) {
                super(itemView);
                tvName = (TextView) itemView.findViewById(R.id.name);
                tvDate = (TextView) itemView.findViewById(R.id.date);
            }
        }
    
        @Override
        public int getItemCount() {
            return mCursorAdapter.getCount();
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            // Passing the binding operation to cursor loader
            mcursorAdapter.getCursor().moveToPosition(position);
            mCursorAdapter.bindView(holder.itemView, mContext, mCursorAdapter.getCursor());
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // Passing the inflater job to the cursor-adapter
            View v = mCursorAdapter.newView(mContext, mCursorAdapter.getCursor(), parent);
            holder = new ViewHolder(v);
            return holder;
        }
    }
    

    如果有人知道它为什么起作用,请随时加入讨论。谢谢。

    【讨论】:

    • 嗨!这是我知道的旧帖子。我尝试使用它。我不知道如何在活动中调用它。 EpisodesAdapter episodesAdapter = new EpisodeAdapter(this,cursorEpisode,0); rvEpisodeImage.setAdapter(episodesAdapter); 这不起作用
    【解决方案2】:

    您应该使用布局上的所有对象(您需要的所有元素)创建 ViewHolder,而不是创建带有 View 的 ViewHolder。布局视图必须在 onCreateViewHolder 方法中创建(膨胀)。

    类似的东西:

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
    {
        class ViewHolder extends RecyclerView.ViewHolder {
            TextView textView1;
            TextView textView2;
    
            public ViewHolder(View itemView) {
                super(itemView);
                textView1 = (TextView) itemView.findViewById(R.id.textView1);
                textView2 = (TextView) itemView.findViewById(R.id.textView2);
            }
    
            public void insertView(String result1, String result2) {
                textView1.setText(result1);
                textView2.setText(result2);
            }
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_name, parent, false);
            RecyclerView.ViewHolder viewHolder = new ViewHolder(itemView);
    
            return viewHolder;
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            ((ViewHolder) holder).insertView(results.get(position).getResult1(), results.get(position).getResult2());
        }
    
        @Override
        public int getItemCount() {
            return results.size();
        }
    }
    

    I think this can help you

    您可以使用ORMSugar 进行持久化。不过,如果您有可能访问适配器之外的数据库,那就更好了。您将从数据库中获取必要的信息并将该信息传递给适配器构造函数。

    如果你需要一个例子,你只需要告诉我。

    【讨论】:

    • 感谢您的回答,但似乎缺少CursorAdapter。我在适配器内部使用CursorAdapter 的原因是我从数据库中获取数据。我可以像您一样以普通方式实现RecyclerView 适配器,但是当CursorAdapter 参与其中时,我开始遇到问题。
    • 哦,对不起,我忘记了这部分。为什么不使用像 SugarORM 这样的 ORM?它比 CursorAdapter 更容易。
    猜你喜欢
    • 2022-01-18
    • 2019-02-04
    • 2017-03-28
    • 2023-03-17
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多