Реализация RecyclerView с курсором-адаптером - PullRequest
0 голосов
/ 19 мая 2018

Как я могу реализовать RecyclerView с помощью курсора.Я пытался реализовать этот код , но этот код использует некоторый класс для хранения каждой строки, но я не хотел создавать какой-то класс для хранения каждой строки курсора.А также я нашел эту статью , в которой говорится, что нам не нужно создавать класс при использовании курсора.Я запутался, какой подход использовать и как его использовать.Я попытался реализовать большую часть кода, представленного в 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);
    }
}

Это My MainActivity

 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 Но когда новые данныедобавляется в базу данных, после чего приложение требует повторного запуска.Сам не обновляется.

1 Ответ

0 голосов
/ 19 мая 2018

Ну, это показывает текст в RecyclerView

Это не будет так надежно.В onBindViewHolder() замените moveToNext() на moveToPosition(position).Прямо сейчас вы игнорируете параметр position, что означает, что как только вы начнете прокручивать (особенно назад), у вас возникнут проблемы.

Но когда новые данные добавляются в базу данныхтогда приложение требует, чтобы начать снова.Он не обновляется сам по себе.

Это ничем не отличается от того, как CursorAdapter работает с AdapterView, таким как ListView.

Когда вы обновляете базу данных,вам нужно получить свежий Cursor и передать его вашему RecyclerViewAdapter.Ваш RecyclerViewAdapter может затем позвонить notifyDataSetChanged(), чтобы сообщить RecyclerView о перерисовке.

...