首页 文章

ItemTouchHelper滑动以消除适配器列表大小的两倍

提问于
浏览
0

大家好 . 我已经使用ItemTouchHelper.SimpleCallback实现了一次轻扫来消除我的recyclerview上的行为,这种方法非常有效,直到我从firebase数据库中删除当前的卡片信息 . 如果在onSwiped覆盖的方法中,我只是从列表中删除卡片项,行为是正常的,这一切都很好:

@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,将是item1 item3 item1 item3

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

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

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

1 回答

  • 0

    我已经解决了这个问题 . 问题是,当打开片段并使用firebase中的项目列表填充适配器时,我使用了 reference.addValueEventListener( ... ) ,它正在侦听数据库上的每个更改,并在需要时重新更改数据 . 因此,在删除之后,它会以某种方式在当前列表中添加其余的通知 .

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

相关问题