我在Firebase中有以下数据库结构。它是管理数据库中用户及其数据的一种非常标准的方法。我还利用了FirebaseUI中的FirebaseRecyclerAdapter
。
-root
-users
-user1
-item0
-item1
-item2
...
-user2
...
现在我想实现滑动删除/撤消功能。对于滑动删除部分,我已实施ItemTouchHelper.SimpleCallback
方法来捕获onSwiped
状态。在回调中,我只需使用
mFirebaseAdapter.getRef(indexOfDeletedItem).removeValue();
以这种方式,刷新的项目立即被删除在数据库中。但是,当我尝试恢复它时。我无法插入到原来的位置。例如,
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
//get the location of swiped item.
final int indexOfDeletedItem = viewHolder.getAdapterPosition();
//I cached the item in case I need to restore it.
final ITEM deletedItem = mFirebaseAdapter.getItem(indexOfDeletedItem);
//remove the item on swipe
mFirebaseAdapter.getRef(indexOfDeletedItem).removeValue();
Snackbar.make(findViewById(R.id.myCoordinatorLayout), "Deleted Item", Snackbar.LENGTH_LONG)
.setAction("UNDO", new View.OnClickListener() {
@Override
public void onClick(View v) {
//When user want to restored the deleted item
//I need to add the deleted data back to database.
mFirebaseAdapter.getRef(indexOfDeletedItem).push()setValue(deletedItem);
}
}).show();
}
我无法正确地将数据插入(添加)到特定位置 而不会覆盖它。 我认为项目的索引在我调用{{}后立即更新1}}
例如,对于mFirebaseAdapter.getRef(indexOfDeletedItem).removeValue();
,我user1
的索引为item0
,
0
和的 item1
索引1
item2
2
如果有办法让它回到
index 0 1 2
item0 --> item1 --> item2 //now swipe on item1
item0 --> item2 //now user click undo
item0 --> item1 //item2 gets overwritten
就我而言,我总是覆盖 item0 --> item1 --> item2
上的数据。
我正在寻找一个API来将节点插回数据库而不会覆盖它。换句话说,如何将节点(item1)推送到之前的位置?
答案 0 :(得分:1)
问题是,当您还原项目时,适配器的引用会更改,并且您正在接收不同的引用。在删除项目之前,只需创建Databasereference的本地副本。 E.g。
ref.setValue(deletedItem);
稍后在小吃栏行动中你可以打电话:
{{1}}