我有一个主视图,其中有一个RecyclerView(category_view),在category_view的每个ViewHolder中都有另一个RecyclerView(task_view)。因此,每个类别中都有几个任务。数据是从SQLite DB填充的,我有用于类别和任务的表。另外,我为Category和Task数据类都指定了Parcelable。
当前,我将带有类别表的游标从MainActivity传递给CategoriesRecyclerAdapter +数据库本身。然后在CategoriesRecyclerAdapter中创建另一个Cursor,并将其传递给TasksRecyclerAdapter。
嵌套的RecycleView任务中的操作(复选框打勾)会导致类别和任务SQLite表中的更改。
我的问题是-如何在这些嵌套适配器之间传递数据而又不将整个数据库链接或DB Open Helper传递给每个ViewHolder?
因此,当前我正在传递指向mDb = mDbOpenHelper.getReadableDatabase()的链接,因此每个适配器都可以访问它。现在我需要将数据写入DB,因此我可以将2个链接或1个链接传递给DBOpenHelper,并在每个class.viewHolder中打开DB。我不确定在每个ViewHolder中打开数据库是否是最佳方案。谁能建议其他解决方案或确认没问题?
\\Main Activity: make a cursor and pass it to CategoriesRecyclerAdapter
...
private void getCategoriesFromDB() {
mDb = mDbOpenHelper.getReadableDatabase();
final Cursor categoryCursor = mDb.query(CategoryEntry.TABLE_NAME,
null, null, null, null, null, null);
mCategoryRecyclerAdapter.changeCursor(categoryCursor, mDb);
}
\\CategoryRecyclerAdapter:
...
public void changeCursor(Cursor cursor, SQLiteDatabase db) {
if (mCursor != null)
mCursor.close();
mCursor = cursor;
populateColumnPositions();
notifyDataSetChanged();
mDb = db;
}
...
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
mCursor.moveToPosition(i);
String selection = TaskEntry.COLUMN_CATEGORY_ID + " = ?";
String selectionArgs[] = {Integer.toString(mId)};
final Cursor taskCursor = mDb.query(TaskEntry.TABLE_NAME, null,
selection, selectionArgs, null, null, null);
LinearLayoutManager tasksLayoutManager = new LinearLayoutManager(viewHolder.mHolderView.getContext());
TaskRecyclerAdapter taskRecyclerAdapter = new TaskRecyclerAdapter(viewHolder.mHolderView.getContext(), null, mDb);
RecyclerView recyclerTasks = viewHolder.mHolderView.findViewById(R.id.list_tasks);
recyclerTasks.setLayoutManager(tasksLayoutManager);
recyclerTasks.setAdapter(taskRecyclerAdapter);
taskRecyclerAdapter.changeCursor(taskCursor);
}
答案 0 :(得分:0)
这通常是个坏主意。理想情况下,您希望将侦听器传递给适配器,并侦听片段/活动中的事件。从他们那里,您应该使用viewmodel / presenter与数据库层进行通信以进行更新。根据操作的结果(成功/失败),您可以使用notifyItemChanged更新适配器,或者如果冒险尝试使用数据绑定解决方案,则只需更新适配器的数据模型。