删除RecyclerView Firebase项目Android Java
我使用删除RecyclerView Firebase项目Android Java,java,android,firebase,android-recyclerview,Java,Android,Firebase,Android Recyclerview,我使用RecyclerView创建了一个收藏夹页面,其中数据保存在firebase上。我正在尝试实时从firebase和recyclerview中删除一个项目。我可以使用删除该项目 dataSnapshot.child(countries.get(position).getId()).getRef().removeValue(); countries.remove(position); 但是,我无法删除最后一项,但它会在firebase中删除。我试过不同的组合 notifyDataSetCha
RecyclerView
创建了一个收藏夹页面,其中数据保存在firebase上。我正在尝试实时从firebase和recyclerview中删除一个项目。我可以使用删除该项目
dataSnapshot.child(countries.get(position).getId()).getRef().removeValue();
countries.remove(position);
但是,我无法删除最后一项,但它会在firebase中删除。我试过不同的组合
notifyDataSetChanged();
notifyItemRemoved(position);
notifyItemRangeChanged(position, countries.size());
但由于目前为止运气不佳,我看不出我错在哪里
填充回收视图
Public class FavouritesFragment extends Fragment {
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
RecyclerView.Adapter adapter;
ArrayList<Country> countries;
private FirebaseAuth firebaseAuth;
private DatabaseReference databaseReference;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_favourites, container, false);
getActivity().setTitle("Favourites");
firebaseAuth = FirebaseAuth.getInstance();
databaseReference = FirebaseDatabase.getInstance().getReference();
FirebaseUser user = firebaseAuth.getCurrentUser();
String userID = user.getUid();
databaseReference = databaseReference.child("users").child(userID).child("Favourites");
recyclerView = view.findViewById(R.id.favourites_recycler);
countries = new ArrayList<>();
layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
addFavourites();
return view;
}
public void addFavourites(){
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()){
Country c = ds.getValue(Country.class);
countries.add(c);
}
adapter = new FavouritesAdapter(countries);
recyclerView.setAdapter(adapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
执行此操作以从列表中删除对象,在
deleteFavorite()
函数中:
..........
if(dataSnapshot.exists() && dataSnapshot.child(id).exists()){
dataSnapshot.child(countries.get(position).getId()).getRef().removeValue();
countries.remove(countries.get(position));
notifyDataSetChanged();
}
..............
在适配器中,您没有将
位置设置为需要删除的项目的位置。因此,当用户点击弹出菜单中的删除项时,您可以调用deleteFavorite()
,但在调用deleteFavorite()
之前,需要设置类字段位置
因此,在onBindViewHolder
中,您需要将第二个参数的值分配给位置
,最好将其作为类似deleteFavorite(位置)
的参数传递给deleteFavorite()
方法:
然后更改deleteFavorite
以接受新参数,并更改notifyItemRemoved(位置)代码>
这最终会从firebase中删除所有数据。什么是从firebase中删除所有数据?谢谢,这很有效。如果将来有人遇到同样的问题,使用此代码并同时将databaseReference.addValueEventListener
更改为databaseReference.addListenerForSingleValueEvent
将解决此问题。
..........
if(dataSnapshot.exists() && dataSnapshot.child(id).exists()){
dataSnapshot.child(countries.get(position).getId()).getRef().removeValue();
countries.remove(countries.get(position));
notifyDataSetChanged();
}
..............
@Override
public void onBindViewHolder(@NonNull final FavouritesAdapter.MyViewHolder myViewHolder, final int pos) {
....
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_to_favs:
deleteFavourite(pos);
break;
default:
return false;
}
return true;
}
});
public void deleteFavourite(int pos){
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String id = countries.get(pos).getId();
if(dataSnapshot.exists() && dataSnapshot.child(id).exists()){
dataSnapshot.child(countries.get(pos).getId()).getRef().removeValue();
countries.remove(pos);
notifyItemRemoved(pos);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}