ItemTouchHelper滑动可忽略适配器列表大小的两倍



向所有人问好。我已经用ItemTouchHelper.SimpleCallback在我的recyclerview上实现了一个"刷即弃"行为,在我从firebase数据库中删除当前卡信息之前,它运行得很好。如果在onSwiped overrided方法中,我只是从列表中删除卡片项目,那么行为是正常的,一切都很好:

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
final int poz = viewHolder.getAdapterPosition();
rentAnnounceAdapter.remove(poz);
}

但是,如果我从Firebase数据库中删除卡信息,就像这样:

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
final int poz = viewHolder.getAdapterPosition();
String ID = rentAnnounceAdapter.getList()
.get(poz)
.getAnnounceID();
DatabaseReference dbRef = FirebaseDatabase.getInstance()
.getReference();
dbRef.child(REF_RENT)
.child(ID)
.removeValue();
StorageReference ref = FirebaseStorage.getInstance()
.getReference();
ref.child(REF_RENT_IMAGES)
.child(ID)
.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
rentAnnounceAdapter.remove(poz);
}
});
}

数据从firebase数据库中删除,卡片从列表中删除,但是,在当前删除的元素之后,没有当前元素的列表被添加到已删除的元素下。我真的不明白为什么会发生这样的事情,如果我从firebase中移除物品,但如果我不从firebase移除,所有的都是正常的

为了更好地理解,如果我有lis

item1
item2
item3

如果我删除项目3,屏幕上显示的列表将是

item1
item2
item1
item2

或者,另一个例子,如果我删除item2,将是第1项第3项第1项第3项

在我的片段中,我将ItemTouchHelper附加到recycleview,如下所示:

public void addDismissBehavior(){
ItemTouchHelper.Callback callback = new CardSwipeItemTouchHelper(adapter);
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(rents);
}

CardSwipeItemTouchHelper类:

public class CardSwipeItemTouchHelper extends ItemTouchHelper.SimpleCallback {
private RentAnnounceAdapter rentAnnounceAdapter;
private static final String REF_RENT = "rent-announces";
private static final String REF_RENT_IMAGES = "rent-images";
public CardSwipeItemTouchHelper(RentAnnounceAdapter adapter){
super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
this.rentAnnounceAdapter = adapter;
}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
rentAnnounceAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
final int poz = viewHolder.getAdapterPosition();
String ID = rentAnnounceAdapter.getList()
.get(poz)
.getAnnounceID();
DatabaseReference dbRef = FirebaseDatabase.getInstance()
.getReference();
dbRef.child(REF_RENT)
.child(ID)
.removeValue();
StorageReference ref = FirebaseStorage.getInstance()
.getReference();
ref.child(REF_RENT_IMAGES)
.child(ID)
.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
rentAnnounceAdapter.remove(poz);
}
});
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
final int poz = viewHolder.getAdapterPosition();
rentAnnounceAdapter.remove(poz);
}

}

从适配器中删除和交换方法,剩下的是基本的适配器方法

public void remove(int position){
cardRentAnnounceArrayList.remove(position);
notifyItemRemoved(position);
}
public void swap(int fPoz, int secPoz){
Collections.swap(cardRentAnnounceArrayList, fPoz, secPoz);
notifyItemMoved(fPoz, secPoz);
}

如果有人知道这里发生了什么,请告诉我。谢谢

编辑1

经过一个小时的调试,我仍然没有发现问题。如果有人知道答案。。。我在等它

我已经解决了这个问题。问题是,当打开片段并用firebase中的项目列表填充适配器时,我使用了reference.addValueEventListener( ... ),它正在侦听数据库上的每一个更改,并在需要时重新更改数据。因此,在删除后,不知何故,它将其余公告添加到了当前列表中。

使用reference.addListenerForSingleValueEvent ( .. )下载列表解决了我的问题,因为每次删除后都不需要重新下载和设置列表,因为它在本地和在线数据库上都是同步删除的。

最新更新