我有一个简单的待办事项列表应用,带有recyclerview/firestoreRecyCyclerAdapter/itemTouchhelper,带有项目A,B,C,D的项目(请参阅图片附加(。现在,我想有效地将这些物品的位置存储在Firestore中,最初是当我添加一个项目时,并且每当我垂直拖动时,放他们。我该如何进行构想或现有/示例代码进行操作。将其存储在云中很重要,因此如果我从另一个设备上看一下,则项目位置保持不变。
关于它的一些想法:适配器位置(INT(从0开始(在这种情况下为D(。当我添加项目E时,则具有适配器位置0,所有其他项目的位置会发生变化。因此,每次添加新项目将显示在顶部时,在Firestore中存储的位置可能会增加1。但是,如果我有项目(例如,在照片库应用程序中(该怎么办。如果我每次拖动&放下项目?
我想这应该是一个非常普遍的问题。
我的todo应用程序(https://i.stack.imgur.com/o3jj1.jpg(
这是我的Method 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);
}
}
现在,我想有效地将这些物品的位置存储在Firestore中,最初是当我添加一个项目时,并且每当我垂直拖动&amp;放下它们。
虽然从技术上讲这是可能的,但我认为Firestore并不是该问题的最佳选择,因为Firestore的所有内容都大约是阅读和写入的数量。因此,每次更改项目的位置时,您都会经历许多等于其余项目数量的写操作。也尝试查看Firebase实时数据库。两者都很好地工作。
我该如何在概念上做
只需为每个元素添加订单号属性,代表列表中的位置,然后根据该属性订购(上升或下降(。一旦将元素从一个位置移到另一个位置,就会将每个剩余的OBEJCT的位置更新一个。
将其存储在云中很重要,因此如果我从另一个设备上看一下,物品位置保持不变。
如果您将所有元素保持订购,则每个用户都可以看到相同的安排。
因此,每次添加新项目时,Firestore中存储的位置可能应增加1个
对,每次添加新项目时,职位都会增加一个。
如果我每次拖动&amp;放下项目?
在列表开头更新项目的位置肯定是非常昂贵的。让我们举个例子。假设您有1000个项目的集合,并且要添加一个新项目作为列表中的第二个项目。这意味着您将收取一个写作操作,以添加项目以及另外999个写操作,以更新其余999个项目的位置。因此,总共您将收取1000个写操作的费用。由您决定这脚是否需要您的需求。