У меня есть простое приложение со списком задач с RecyclerView / FirestoreRecyclerAdapter / ItemTouchHelper с элементами A, B, C, D (см. Рисунок в приложении). Теперь я хотел бы эффективно хранить положение этих элементов в Firestore, первоначально, когда я добавляю элемент и когда я когда-либо перетаскиваю их вертикально. Как я могу сделать это концептуально или с существующим / пример кода. Важно хранить его в облаке, чтобы положение элементов оставалось неизменным, если я посмотрю его с другого устройства.
Некоторые идеи по этому поводу:
Позиции адаптера (int) начинаются с 0 (в данном случае D). Когда я добавляю элемент E, то он имеет позицию адаптера 0, и позиции всех других элементов меняются. Таким образом, сохраненная позиция в Firestore, вероятно, должна увеличиваться на 1 каждый раз, когда добавляется новый элемент, который будет отображаться вверху. Но что, если у меня есть тысячи вещей (например, в приложении фотогалереи). Эффективно ли, если я обновляю позицию для всех элементов каждый раз, когда перетаскиваю элемент?
Думаю, это должно быть очень распространенной проблемой.
MainActivity моего приложения Todo (https://i.stack.imgur.com/o3jJ1.jpg)
Вот мой код для метода ItemTouchHelper.Callback onMoved ():
@Override
public void onMoved(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, int fromPos, @NonNull RecyclerView.ViewHolder target, int toPos, int x, int y) {
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
for (int maxItems = recyclerView.getChildCount(), i = 0; i < maxItems; ++i) {
RecyclerView.ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
int layoutPosition = holder.getLayoutPosition();
int adapterPosition = holder.getAdapterPosition();
TodoAdapter.TodoHolder h = (TodoAdapter.TodoHolder)holder;
String documentID = h.getDocumentID();
TextView textViewTitle = (TextView)h.itemView.findViewById(R.id.todo_title);
CharSequence title = textViewTitle.getText();
DocumentReference docRef = mFirestore.collection("todos").document(documentID);
docRef.update("position", adapterPosition);
}
}