通过滑动删除 Firebase 对象
Delete Firebase object with swipe
我想在向左滑动时从 Firebase 中删除一个对象。现在滑动一切正常,它从视图中删除,但它保留在数据库中。
我已将以下内容添加到我的 onCreate 中:
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
Toast.makeText(ListBox.this, "Item removed", Toast.LENGTH_SHORT).show();
//Remove swiped item from list and notify the RecyclerView
}
};
这就是我填充 ViewHolder 的方式。
@Override
protected void populateViewHolder(final BoxViewHolder viewHolder, final Box model, int position) {
viewHolder.setTitle(model.getTitle());
final String boxUniqueKey = model.getBoxkey();
final DatabaseReference postRef = getRef(position);
final String postKey = postRef.getKey();
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Launch BoxItem view
final Intent intent = new Intent(ListBox.this, AddBoxItem.class);
String boxkey = model.getBoxkey();
String boxName = model.getTitle();
startActivity(intent);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(allBoxes);
}
});
}
但是如何(以及在哪里)获取项目的位置,以及如何将删除查询发送到 Firebase 数据库?
我编写的代码与您要实现的目标非常相似。这是您可以实现它的一种方式。
首先,扩展 ItemTouchHelper.SimpleCallback
class 以创建您自己的自定义 class。
public class SwipeToDeleteCallback extends ItemTouchHelper.SimpleCallback {
private RecyclerAdapter adapter; // this will be your recycler adapter
private DatabaseReference root = FirebaseDatabase.getInstance().getReference();
/**
*
Make sure you pass in your RecyclerAdapter to this class
*/
public CallBack(int dragDirs, int swipeDirs, RecyclerAdapter adapter) {
super(dragDirs, swipeDirs);
this.adapter = adapter;
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition(); // this is how you can get the position
Object object = adapter.getObject(position); // You will have your own class ofcourse.
// then you can delete the object
root.child("Object").child(object.getId()).setValue(null);// setting the value to null will just delete it from the database.
}
调用viewHolder.getAdapterPosition()
returns视图在适配器中的位置。您可以使用此位置从回收器适配器中包含的 ArrayList
中获取 Object
。
在我的适配器中,我创建了一个 getObject
方法。这只是 returns 来自我的适配器的 ArrayList
的对象。获得对象后,我可以调用关联的 Firebase 实时数据库方法并删除该对象。在我的 Object
class 中,我已将唯一键存储在对象中,因此我可以轻松删除它。我通过调用 getId()
获得唯一 ID。我将其传递给关联的 Firebase 实时数据库方法并将值设置为 null
以删除它。
完成此操作后,您可以像这样将其添加到回收站视图中。
ItemTouchHelper.SimpleCallback swipeToDeleteCallback = new
SwipeToDeleteCallback(0, ItemTouchHelper.RIGHT, choreRecyclerAdapter, getContext()); // Making the SimpleCallback
ItemTouchHelper touchHelper = new ItemTouchHelper(swipeToDeleteCallback);
touchHelper.attachToRecyclerView(recyclerView); // then attach it to your recycler view
首先,您进行一个简单的回调并确保实例化您扩展的自定义 class。请务必通过您的回收适配器。
请注意,我只支持通过 ItemTouchHelper.Right
向右滑动。可以左撑也可以左右都传。
然后创建一个 ItemTouchHelper
对象并将其传递给您的简单回调。
最后,您将触摸助手附加到回收站视图,仅此而已。
我想在向左滑动时从 Firebase 中删除一个对象。现在滑动一切正常,它从视图中删除,但它保留在数据库中。
我已将以下内容添加到我的 onCreate 中:
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
Toast.makeText(ListBox.this, "Item removed", Toast.LENGTH_SHORT).show();
//Remove swiped item from list and notify the RecyclerView
}
};
这就是我填充 ViewHolder 的方式。
@Override
protected void populateViewHolder(final BoxViewHolder viewHolder, final Box model, int position) {
viewHolder.setTitle(model.getTitle());
final String boxUniqueKey = model.getBoxkey();
final DatabaseReference postRef = getRef(position);
final String postKey = postRef.getKey();
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Launch BoxItem view
final Intent intent = new Intent(ListBox.this, AddBoxItem.class);
String boxkey = model.getBoxkey();
String boxName = model.getTitle();
startActivity(intent);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(allBoxes);
}
});
}
但是如何(以及在哪里)获取项目的位置,以及如何将删除查询发送到 Firebase 数据库?
我编写的代码与您要实现的目标非常相似。这是您可以实现它的一种方式。
首先,扩展 ItemTouchHelper.SimpleCallback
class 以创建您自己的自定义 class。
public class SwipeToDeleteCallback extends ItemTouchHelper.SimpleCallback {
private RecyclerAdapter adapter; // this will be your recycler adapter
private DatabaseReference root = FirebaseDatabase.getInstance().getReference();
/**
*
Make sure you pass in your RecyclerAdapter to this class
*/
public CallBack(int dragDirs, int swipeDirs, RecyclerAdapter adapter) {
super(dragDirs, swipeDirs);
this.adapter = adapter;
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition(); // this is how you can get the position
Object object = adapter.getObject(position); // You will have your own class ofcourse.
// then you can delete the object
root.child("Object").child(object.getId()).setValue(null);// setting the value to null will just delete it from the database.
}
调用viewHolder.getAdapterPosition()
returns视图在适配器中的位置。您可以使用此位置从回收器适配器中包含的 ArrayList
中获取 Object
。
在我的适配器中,我创建了一个 getObject
方法。这只是 returns 来自我的适配器的 ArrayList
的对象。获得对象后,我可以调用关联的 Firebase 实时数据库方法并删除该对象。在我的 Object
class 中,我已将唯一键存储在对象中,因此我可以轻松删除它。我通过调用 getId()
获得唯一 ID。我将其传递给关联的 Firebase 实时数据库方法并将值设置为 null
以删除它。
完成此操作后,您可以像这样将其添加到回收站视图中。
ItemTouchHelper.SimpleCallback swipeToDeleteCallback = new
SwipeToDeleteCallback(0, ItemTouchHelper.RIGHT, choreRecyclerAdapter, getContext()); // Making the SimpleCallback
ItemTouchHelper touchHelper = new ItemTouchHelper(swipeToDeleteCallback);
touchHelper.attachToRecyclerView(recyclerView); // then attach it to your recycler view
首先,您进行一个简单的回调并确保实例化您扩展的自定义 class。请务必通过您的回收适配器。
请注意,我只支持通过 ItemTouchHelper.Right
向右滑动。可以左撑也可以左右都传。
然后创建一个 ItemTouchHelper
对象并将其传递给您的简单回调。
最后,您将触摸助手附加到回收站视图,仅此而已。