【问题标题】:Implementation of RecyclerView with cursor AdapterRecyclerView 与 cursor Adapter 的实现
【发布时间】:2018-05-19 19:42:55
【问题描述】:

如何使用光标实现 RecyclerView。我试图实现this code,但是这段代码使用一些类来存储每一行​​,但我不想为了存储游标的每一行而创建一些类。而且我还发现了这个article,它说我们在使用光标时不需要上课。我很困惑使用哪种方法以及如何使用它。我试图实现 stackOverFlow 上的大部分代码,但它们几乎都是一样的。

我也用这个尝试了我的代码:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>{
    private Cursor cursor;
    public class MyViewHolder extends RecyclerView.ViewHolder{
        TextView title,text;
        CardView cd;
        LinearLayout ll;
        public MyViewHolder(View v){
            super(v);
            title = v.findViewById(R.id.childTitleView);
            text = v.findViewById(R.id.childTextView);
            cd = v.findViewById(R.id.parentCardView);
            ll = v.findViewById(R.id.ll);
         }

    }

    public RecyclerViewAdapter(Cursor c){
        this.cursor = c;
    }

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

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        cursor.moveToNext();
        String t = cursor.getString(cursor.getColumnIndex(RecordContract.RecordEntry.COLUMN_TITLE));
        String d = cursor.getString(cursor.getColumnIndex(RecordContract.RecordEntry.COLUMN_TEXT));
        holder.title.setText(t);
        holder.text.setText(d);
        holder.cd.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                Toast.makeText(view.getContext(), ""+position, Toast.LENGTH_SHORT).show();
                //holder.ll.setBackgroundColor(Color.parseColor("#000"));
                holder.cd.setBackgroundColor(Color.parseColor(view.getResources().getString(R.color.blueGreen)));
                return true;
            }
        });

    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_child,parent,false);
        return new MyViewHolder(itemView);
    }
}

这是我的主要活动

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mdb = new RecordDbHelper(getApplicationContext());

        RecyclerView rv = findViewById(R.id.recylerViewId);
        rv.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));
        rv.setItemAnimator(new DefaultItemAnimator());
        Cursor c = getCursor();
        RecyclerViewAdapter rva = new RecyclerViewAdapter(c);
        rv.setAdapter(rva);
  }

   public Cursor getCursor(){
        SQLiteDatabase db = mdb.getReadableDatabase();
        String[] projection = {
            RecordContract.RecordEntry._ID,  RecordContract.RecordEntry.COLUMN_TEXT,
            RecordContract.RecordEntry.COLUMN_TITLE};
        String selection = null;
        String[] selectionArgs = null;
        String tableName = RecordContract.RecordEntry.TABLE_NAME;
        Cursor c = db.query(tableName,projection,selection,selectionArgs,null,null,null);
        return c;
    }

这会在 RecyclerView 中显示文本但是当向数据库添加新数据时,应用程序需要重新启动。它不会自行刷新。

【问题讨论】:

  • 为什么需要在适配器中传递光标

标签: android android-recyclerview android-cursor sectionedrecyclerviewadapter


【解决方案1】:

这会在 RecyclerView 中显示文本

它不会可靠地这样做。在onBindViewHolder() 中,将moveToNext() 替换为moveToPosition(position)。现在,您忽略了position 参数,这意味着一旦您开始滚动(尤其是向后滚动),就会遇到问题。

但当新数据添加到数据库时,应用程序需要重新启动。它不会自行刷新。

这与CursorAdapterAdapterView 的工作方式没有什么不同,例如ListView

更新数据库时,您需要获取一个新的Cursor 并将其交给您的RecyclerViewAdapter。然后你的RecyclerViewAdapter 可以调用notifyDataSetChanged() 告诉RecyclerView 重绘自己。

【讨论】:

  • 我在onBindViewHolder()中访问游标的方法正确吗?
  • @MayankDoda:正如我所提到的,您需要将moveToNext() 替换为moveToPosition(position)。否则,我认为它没有任何问题。就个人而言,我会将大部分逻辑放在ViewHolder 中,onBindViewHolder() 只需调用moveToPosition() 并将Cursor 传递给ViewHolder 以进行实际绑定。
  • 你能帮忙实现 onResume 函数的代码吗?我尝试在 onResume 中使用 rva.notifydataSetChanged() 但它不起作用。
  • @MayankDoda:对不起,但我不知道你在onResume() 做什么,我不知道在这种情况下“不起作用”是什么意思。您可以考虑提出单独的 Stack Overflow 问题,在其中提供新的 minimal reproducible example 并详细解释问题的性质。
  • 为了刷新 recyclerView 我试图使用 notifyDataSetChanged() 方法,但 RecyclerView 没有更新。它显示相同的数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多