ItemTouchHelper 轻扫以关闭适配器列表的两倍大小
ItemTouchHelper swipe to dismiss double the size of the adapter list
大家好。
我已经使用 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,将是
项目1
项目3
项目1
item3
在我的片段中,我将 ItemTouchHelper 附加到 recyclerview,如下所示:
public void addDismissBehavior(){
ItemTouchHelper.Callback callback = new CardSwipeItemTouchHelper(adapter);
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(rents);
}
CardSwipeItemTouchHelper class :
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( ... )
来监听数据库中的每个更改,并在需要时使用 re-changing 数据。因此,在删除之后,它以某种方式将其余的公告添加到当前列表中。
使用 reference.addListenerForSingleValueEvent ( .. )
下载列表解决了我的问题,因为不需要 re-download 并在每次删除后设置列表,因为它在本地和在线数据库上同步删除。
大家好。 我已经使用 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,将是 项目1 项目3 项目1 item3
在我的片段中,我将 ItemTouchHelper 附加到 recyclerview,如下所示:
public void addDismissBehavior(){
ItemTouchHelper.Callback callback = new CardSwipeItemTouchHelper(adapter);
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(rents);
}
CardSwipeItemTouchHelper class :
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( ... )
来监听数据库中的每个更改,并在需要时使用 re-changing 数据。因此,在删除之后,它以某种方式将其余的公告添加到当前列表中。
使用 reference.addListenerForSingleValueEvent ( .. )
下载列表解决了我的问题,因为不需要 re-download 并在每次删除后设置列表,因为它在本地和在线数据库上同步删除。