У меня есть главное представление с одним RecyclerView (category_view) в нем и другим RecyclerView (task_view) в каждом ViewHolder в category_view.Таким образом, в каждой категории есть несколько задач.Данные заполняются из БД SQLite, у меня есть таблицы для категорий и задач.Также я указал Parcelable для классов данных Category и Task.
В настоящее время я передаю таблицу Cursor with Categories из MainActivity в CategoriesRecyclerAdapter + саму базу данных.Затем в CategoriesRecyclerAdapter я создаю другой курсор и передаю его TasksRecyclerAdapter.
Действия во вложенных задачах RecycleView (флажок) вызывают изменения в таблицах SQLite категорий и задач.
Мой вопрос - какпередавать данные между этими вложенными адаптерами, не передавая всю ссылку на БД или помощника по открытию БД в каждый ViewHolder?
Так что в настоящее время я передаю ссылку на mDb = mDbOpenHelper.getReadableDatabase (), чтобы каждый адаптер мог получить к ней доступ.Теперь мне нужно записать данные в БД, чтобы я мог передать либо 2 ссылки, либо 1 ссылку на DBOpenHelper и открыть БД в каждом class.viewHolder.Я не уверен, что открытие БД в каждом 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);
}