Удалить RecyclerView Firebase Item Android Java - PullRequest
1 голос
/ 19 апреля 2020

Я создал страницу избранного, используя RecyclerView с данными, сохраненными в firebase. Я пытаюсь в реальном времени удалить элемент из базы данных Firebase и из окна восстановления. Я могу удалить элемент, используя

dataSnapshot.child(countries.get(position).getId()).getRef().removeValue();
countries.remove(position);

. Однако я не могу удалить последний элемент, но он удаляется в базе данных. Я пробовал разные комбинации

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

            }

        });    }



}

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

В вашем адаптере вы не установили position в положение элемента, который нужно удалить. Поэтому, когда пользователь нажимает на элемент удаления во всплывающем меню, вы вызываете deleteFavourite();, но вам нужно установить поле класса position перед вызовом deleteFavourite().

Итак, в onBindViewHolder вы необходимо присвоить значение второго параметра position, и лучше передать его в метод deleteFavourite() в качестве параметра, например 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) {

        }

    });    
}
0 голосов
/ 19 апреля 2020

Сделайте это, чтобы удалить объект из списка, в функции deleteFavourite():

..........


           if(dataSnapshot.exists() && dataSnapshot.child(id).exists()){
                dataSnapshot.child(countries.get(position).getId()).getRef().removeValue();

                countries.remove(countries.get(position));
                notifyDataSetChanged();


            }

..............
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...