删除RecyclerView Firebase项目Android Java

bateler8:

我使用创建了一个收藏夹页面,并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) {

            }
        });
    }

}

RecyclerView适配器类中删除

public class FavouritesAdapter extends RecyclerView.Adapter<FavouritesAdapter.MyViewHolder>{
    ArrayList<Country> countries;
    private View view;
    ImageBindingAdapter imageBindingAdapter = new ImageBindingAdapter();
    RecyclerView recyclerView;
    private int position;

    private FirebaseDatabase firebaseDatabase;
    private FirebaseAuth firebaseAuth;
    private DatabaseReference databaseReference;

    public FavouritesAdapter(ArrayList<Country> countries1){
        countries = countries1;
    }

    @NonNull
    @Override
    public FavouritesAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.favourites, viewGroup, false);
        recyclerView = view.findViewById(R.id.favourites_recycler);

        firebaseAuth = FirebaseAuth.getInstance();
        firebaseDatabase = FirebaseDatabase.getInstance();
        databaseReference = firebaseDatabase.getReference();

        FirebaseUser user = firebaseAuth.getCurrentUser();
        String userID = user.getUid();
        databaseReference = databaseReference.child("users").child(userID).child("Favourites");

        return new FavouritesAdapter.MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final FavouritesAdapter.MyViewHolder myViewHolder, final int i) {
        myViewHolder.name.setText(countries.get(i).getName());
        myViewHolder.snippet.setText(countries.get(i).getSnippet());

        myViewHolder.popUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupMenu popup = new PopupMenu(view.getContext(), view);
                MenuInflater inflater = popup.getMenuInflater();
                inflater.inflate(R.menu.popup_menu, popup.getMenu());
                popup.show();

                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.add_to_favs:

                                deleteFavourite();

                                break;
                            default:
                                return false;
                        }
                        return true;
                    }
                });

            }
        });

    @Override
    public int getItemCount() {
        return countries.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder  {
        public TextView name;
        public ImageView popUp;

        public MyViewHolder(View itemView) {
            super(itemView);

            name = itemView.findViewById(R.id.cityName);
            popUp = itemView.findViewById(R.id.dotsPopUp);

        }

    }

    public void deleteFavourite(){
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String id = countries.get(position).getId();

                if(dataSnapshot.exists() && dataSnapshot.child(id).exists()){
                    dataSnapshot.child(countries.get(position).getId()).getRef().removeValue();
                    countries.remove(position);
//                    notifyDataSetChanged();
//                                            notifyItemRemoved(position);
//                                            notifyItemRangeChanged(position, countries.size());
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }

        });    }



}
Zain:

在您的适配器中,您没有将设置为position需要删除的项目的位置。因此,当用户在弹出菜单中单击删除项时,您会调用deleteFavourite();,但是需要position在调用之前设置类字段deleteFavourite()

因此,在中onBindViewHolder,您需要将第二个参数的值分配给position,最好将它deleteFavourite()作为参数传递给method deleteFavourite(position)

@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;
                }
            });

然后将您的更改deleteFavourite为接受新参数,然后notifyItemRemoved(position);

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

        }

    });    
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章