Обновите адаптер Recycleview при удалении значения из firebase - PullRequest
0 голосов
/ 12 января 2019

Я использовал Recycleview, используя cardivew со списком данных и кнопкой, чтобы удалить любое значение. когда я нажимаю кнопку, он удаляет значение из базы данных Firebase, но текст и строка остаются в адаптере приложения, но только когда я закрываю действие, возвращаясь и открывая снова, строка становится пустой.

Как я могу мгновенно обновить recycleview, когда я нажимаю кнопку удаления

Вот мой код

public class SubjectBooksAdapter extends RecyclerView.Adapter<SubjectBooksAdapter.MyViewHolder> {
    ArrayList<Books> bookslist;

    FirebaseDatabase database;
    DatabaseReference dbreference;


    public SubjectBooksAdapter(ArrayList<Books> bookslist){
        this.bookslist = bookslist;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout,parent,false);
        return new MyViewHolder(v);



    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

   
          Button mSolved;
 




        MyViewHolder(final View itemView) {
            super(itemView);
 
            database = FirebaseDatabase.getInstance();
            dbreference = database.getReference("roomrequest");
             dbreference.keepSynced(true);

            mSolved = (Button) itemView.findViewById(R.id.book_solved);
            mSolved.setTransformationMethod(null);


            fauth = FirebaseAuth.getInstance();



        }
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {

        database = FirebaseDatabase.getInstance();
        dbreference = database.getReference("roomrequest");
        
   
        holder.mSolved.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

               



                    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
                    DatabaseReference classicalMechanicsRef = rootRef.child("roomrequest").child("request").child(g.getRequestid());
                    ValueEventListener valueEventListener = new ValueEventListener() {

                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            dataSnapshot.getRef().removeValue();
                    
                        }

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

                        }
                    };
                    classicalMechanicsRef.addListenerForSingleValueEvent(valueEventListener);

                    
                }
            
        });



 }



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

Любая помощь приветствуется

1 Ответ

0 голосов
/ 12 января 2019
classicalMechanicsRef.addListenerForSingleValueEvent(valueEventListener);

Firebase предоставляет 3 типа прослушивателей событий. Здесь вы используете прослушиватель для события с одним значением. Если вы просто хотите прочитать значение один раз, используйте ref.addListenerForSingleValueEvent().

Здесь вы хотите обновить список из firebase, вам нужно снова получить список из firebase и передать его адаптеру. Но поскольку это событие firebase, оно, очевидно, удалит данные из базы данных firebase, так что вы сможете удалить элемент из своего окна повторного просмотра.

Плохой подход

Если несколько пользователей не обновляют один и тот же список, вы можете использовать ValueEventListener

 reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       // set recyclverview from data
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
       // error handling
    }
});

Этот подход плох, потому что если какой-либо другой пользователь внес изменения в данные, то ваш onDataChange() будет вызываться снова и снова, и ваш список будет обновляться.

Хороший подход

  1. Зарегистрируйтесь с помощью addListenerForSingleValueEvent.
  2. Передайте все предметы адаптеру утилизатора.
  3. Если элемент будет удален, позвоните removeValue(); по ссылке
  4. Снова позвоните в firebase, чтобы проверить, является ли удаленным ключ null, если он нулевой, теперь мы можем обновить наш recyclerview.
  5. Используйте описанный ниже метод для удаления элемента из RecyclerView.

Прежде всего, элемент должен быть удален из списка!

mDataSet.remove(getAdapterPosition());

, то:

notifyItemRemoved(getAdapterPosition());
notifyItemRangeChanged(getAdapterPosition(),mDataSet.size());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...