Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除RecyclerView Firebase项目Android Java_Java_Android_Firebase_Android Recyclerview - Fatal编程技术网

删除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) {

        }

    });    
}