Как удалить элементы из firebase RecyclerView

В настоящее время я работаю над добавлением друзей с помощью firebase RecyclerView, в котором, если пользователь нажимает кнопку ДОБАВИТЬ, он добавляется в базу данных n, что нажатый элемент необходимо удалить навсегда .. Итак, как добиться этого с помощью модели firebase поскольку у нас нет списка данных, из которого можно удалить ..

Вот код

 @Override
public void onStart(){
    super.onStart();
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
    EmailPref=prefs.getString("EmailPref", EmailPref);
    if(EmailPref!=null){

        final Firebase ref = new Firebase(constants.FIREBASE_URL+"rootssahaj/authGplus");


        FirebaseRecyclerAdapter<FriendsData,FriendsViewHolder> adapter=new FirebaseRecyclerAdapter<FriendsData, FriendsViewHolder>(
                         FriendsData.class,
                         R.layout.chat_view_list,
                          FriendsViewHolder.class,
                         ref

                    ) {
            @TargetApi(Build.VERSION_CODES.KITKAT)
            @Override
            protected void populateViewHolder(FriendsViewHolder friendsViewHolder, FriendsData s, int position) {
                String key = this.getRef(position).getKey();
                Log.e("SahajLOG", "String Keyyy " + key + " n EmailPref" + EmailPref);

                if (!Objects.equals(key, EmailPref)) {
                    friendsViewHolder.mName.setText(s.getUserNAME());
                    Picasso.with(context).load(s.getPicurl()).transform(new CircleTransform()).into(friendsViewHolder.mImageProfile);


                    String keylocal = key;
                    Log.e("pavan", "Populate AddF key" + keylocal+" " + position);
                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
                    prefs.getString("keylocal" + position, keylocal + position);
                    if (keylocal != null) {
                        prefs.edit().putString("keylocal" + position, keylocal + position).commit();
                    }
                } else {
                    friendsViewHolder.mCardView.setVisibility(View.GONE);
                    //friendsViewHolder.setVisibility(View.GONE);
                }

            }
        };

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setItemAnimator(new SlideInLeftAnimator());
        recyclerView.getItemAnimator().setAddDuration(1000);
        recyclerView.getItemAnimator().setRemoveDuration(1000);
        recyclerView.getItemAnimator().setMoveDuration(1000);
        recyclerView.getItemAnimator().setChangeDuration(1000);


        SlideInLeftAnimator animator = new SlideInLeftAnimator();
        animator.setInterpolator(new OvershootInterpolator());
        recyclerView.setItemAnimator(animator);
        AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(adapter);
        alphaAdapter.setDuration(500);
        alphaAdapter.setInterpolator(new OvershootInterpolator(.5f));
        alphaAdapter.setFirstOnly(false);
        recyclerView.setAdapter(new ScaleInAnimationAdapter(alphaAdapter));


    }
}

public class FriendsViewHolder extends RecyclerView.ViewHolder{
    ImageView mImageProfile;
    android.widget.TextView mName;
    private int mVisibility;
    Boolean CallAdd=false;
    Button mAdd;
    String keylocal;
    CardView mCardView;

    public FriendsViewHolder(View itemView) {
        super(itemView);
        mCardView=(CardView)itemView.findViewById(R.id.cardView);
        mImageProfile=(ImageView)itemView.findViewById(R.id.profilePICC);
        mName=(android.widget.TextView)itemView.findViewById(R.id.NameUSER);
        context = itemView.getContext();
        mAdd=(Button)itemView.findViewById(R.id.addButton);
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        if(prefs.getBoolean("CallAdd", CallAdd)){
            AddaddButton();

        }

        mAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
               EmailPref = prefs.getString("EmailPref", EmailPref);
               keylocal=prefs.getString("keylocal"+getAdapterPosition(),keylocal+getAdapterPosition());

               final Firebase mFirebaseRef = new Firebase(constants.FIREBASE_URL + "rootssahaj/authGplus/"+ EmailPref);
                mFirebaseRef.child("friends").child(keylocal).setValue("true");
                Log.e("pavan", "Chat Adapter " + EmailPref + keylocal + " final key: " + keylocal);
                //remove(getAdapterPosition());

            }
        });
    }
    public void AddaddButton(){
        if (mAdd.getVisibility() == View.INVISIBLE) {
            mAdd.setVisibility(View.VISIBLE);
        }
    }

}

person Sahaj Rana    schedule 27.03.2016    source источник


Ответы (3)


Если вы посмотрите на этот код, он удаляет заметку из Firebase при нажатии на заметку. Это кажется простым, если вы понимаете запрос Firebase. Это также обновит RecyclerView после правильной настройки адаптера RecyclerView. Вам не нужен список данных, только значение того, что вы хотите удалить, например идентификатор или ключ.

       @Override
        public void onLongClick(View v, int i) {
            mquery.orderByChild("text")
                    .equalTo((String) notes.get(i).getName())
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot.hasChildren()) {
                                DataSnapshot firstChild = dataSnapshot.getChildren().iterator().next();
                                firstChild.getRef().removeValue();
                            }
                        }

                        public void onCancelled(FirebaseError firebaseError) {
                        }
                    });

FirebaseRecyclerAdapter.class из https://github.com/mmazzarolo/firebase-recyclerview работает. Я просто скопировал и вставил, по большей части. Это абстрактный класс, который вы можете использовать для создания адаптера RecyclerView для вашей базы данных Firebase. Весь код находится в этом репозитории GitHub для вас. Вот фрагмент из FirebaseRecyclerAdapter.class, который удаляет значение из Firebase И обновляет recyclerView:

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
        String key = dataSnapshot.getKey();

        if (mKeys.contains(key)) {
            int index = mKeys.indexOf(key);
            T item = mItems.get(index);

            mKeys.remove(index);
            mItems.remove(index);

            notifyItemRemoved(index);
            itemRemoved(item, key, index);
        }
    }

ОБНОВЛЕНИЕ: вы можете скрыть представление во Viewholder адаптера RecyclerView. посмотрите эти ответы в stackoverflow Скрытие представлений в RecyclerView

person ChrisR    schedule 10.04.2016
comment
на самом деле я не хочу удалять данные из firebase, просто чтобы перестать показывать данные tht в reclylerview, то есть друга, которого я добавил - person Sahaj Rana; 10.04.2016

FirebaseUI FirebaseRecyclerAdapter - это прямое представление данных в базовом Query или Firebase расположении. Чтобы удалить элемент из адаптера (и просмотра), вы должны удалить его из местоположения Firebase (или убедиться, что он больше не соответствует запросу).

Итак, когда пользователь запускает удаление (например, щелкая элемент в определенной позиции):

adapter.getRef(position).remove()

См. Также эту проблему в репозитории FirebaseUI на Github.

person Frank van Puffelen    schedule 27.03.2016
comment
о, это означает, что он удалил бы этот узел из базы данных, если бы я напрямую использовал этот метод - person Sahaj Rana; 28.03.2016
comment
Я использую именно эту строку (хотя на самом деле это adapter.getRef (position) .removeValue ()), когда я выполняю longClick. Элемент удаляется, но recyclerview больше не обновляется. Я мог бы задать это как вопрос - person ChrisR; 25.10.2016
comment
та же проблема, как удалить удаленный элемент из recyclerview? - person My Will; 02.11.2016
comment
Вам нужно уведомлять после удаления, предпочтительно на адаптере, adapter.notify() - person luke cross; 26.05.2020

Теперь вы можете легко удалить конкретного ребенка

(1) - Первый шаг создания метода скопируйте ниже кода:

private void deleteRef(String id) { 

    databaseRef.child(id).removeValue();

}

(2) - Второй шаг вызовите этот метод там, где вы хотите, например, диалоговое окно предупреждения или адаптер ресайклера firebase в AlertDialog копии ниже:

public void alertDelete(final String id) { 

    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    LayoutInflater inflater = getLayoutInflater();
    final View dialogView = inflater.inflate(R.layout.warning_delete, null);
    dialogBuilder.setView(dialogView);
    final AlertDialog alertDialog = dialogBuilder.create();
    alertDialog.show();

    final Button deete = dialogView.findViewById(R.id.delete);

    delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            deleteRef(id);
            alertDialog.dismiss();
            Toast.makeText(Teachers_Admin_Activity.this,"Delete Successfully",Toast.LENGTH_LONG).show();                 
        }
    });
}

(3) Или удалите из дочернего узла recyclerview, как это, но помните, что необходимо вызывать из ViewHolder:

@Override
protected void onBindViewHolder(@NonNull final BlogViewHolder holder, final int position, @NonNull final TeachersName model) {

    // this is method in viewholer where you next step to delete specific child node // 
    DatabaseReference itemRef = getRef(position);
    final String myKeyItem = itemRef.getKey();
}

(4) - Последний шаг onclicklistener:

holder.deleteImage.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        alertDelete(myKeyItem);
        return true;
    }
});
person Sehr Mubeen    schedule 04.11.2019