Как сохранить положение элементов в RecyclerView после перетаскивания - PullRequest
0 голосов
/ 05 июля 2019

У меня есть простое приложение со списком задач с 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);
            }
        }

1 Ответ

0 голосов
/ 06 июля 2019

Теперь я хотел бы эффективно сохранить положение этих предметов в Firestore, первоначально, когда я добавляю предмет и когда я когда-либо вертикально перетаскиваю их.

Хотя это технически возможно, я не думаю, что Firestore - лучший вариант для этой проблемы, так как все в Firestore касается количества операций чтения и записи. Таким образом, каждый раз, когда вы меняете положение элемента, вы выполняете количество операций записи, равное количеству оставшихся элементов. Попробуйте взглянуть также на базу данных Firebase в реальном времени . Оба отлично работают вместе.

Как я могу сделать это концептуально

Просто добавив свойство номера заказа для каждого элемента, представляющего позицию в списке, а затем упорядочьте их (по возрастанию или по убыванию) в соответствии с этим свойством. После перемещения элемента из местоположения в другое обновите позицию каждого оставшегося объекта на один.

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

Если вы будете хранить все элементы в порядке, то каждый пользователь сможет увидеть одно и то же расположение.

Таким образом, сохраненная позиция в Firestore, вероятно, должна увеличиваться на 1 каждый раз, когда добавляется новый элемент

Правильно, позиция будет увеличиваться на единицу каждый раз, когда вы добавляете новый элемент.

Эффективно ли, если я обновляю позицию для всех элементов каждый раз, когда перетаскиваю элемент?

Определенно будет очень дорого обновлять позицию элемента в начале списка. Давайте возьмем пример. Допустим, у вас есть коллекция из 1000 элементов, и вы хотите добавить новый элемент в качестве второго элемента в списке. Это означает, что вам нужно оплатить одну операцию записи для добавления элемента плюс еще 999 операций записи для обновления позиции оставшихся 999 элементов. Таким образом, в общей сложности вы будете платить 1000 операций записи. Вы сами решаете, соответствует ли это вашим потребностям или нет.

...