Реализация RecyclerView с помощью адаптера курсора

63
6

Как я могу реализовать 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);
}
}

Это моя основная деятельность

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

спросил(а) 2021-01-25T18:19:32+03:00 4 месяца, 4 недели назад
1
Решение
108

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

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

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

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

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

ответил(а) 2021-01-25T18:19:32+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема