如何从 firebase RecyclerView 中删除项目

问题描述 投票:0回答:4

我目前正在借助 firebase RecyclerView 来添加朋友,其中如果用户点击“添加”按钮,他就会被添加到数据库中,并且需要永久删除点击的项目。那么,如何通过 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);
        }
    }

}
android firebase android-recyclerview firebase-realtime-database
4个回答
17
投票

FirebaseUI

FirebaseRecyclerAdapter
是底层
Query
Firebase
位置中数据的直接表示。要从适配器(和视图)中删除项目,您必须将其从 Firebase 位置中删除(或确保它不再与查询匹配)。

因此,当用户触发删除时(例如,通过单击某个位置的项目):

adapter.getRef(position).remove()

另请参阅 FirebaseUI Github 存储库中的此问题


7
投票
如果您查看此代码,它会在以下情况下从 Firebase 中删除一条注释: 单击注释。如果您了解 Firebase 查询,这似乎很简单。一旦 RecyclerView 适配器设置正确,这也将更新 RecyclerView。您不需要数据列表,只需要删除的值,例如 ID 或密钥。

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

来自

https://github.com/mmazzarolo/firebase-recyclerview

FirebaseRecyclerAdapter.class 有效。 大部分内容我只是复制和粘贴。这是一个抽象类,您可以使用它为 Firebase 数据库制作 RecyclerView 适配器。所有代码都位于 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); } }

更新: 您可以隐藏 RecyclerView 适配器的 Viewholder 中的视图。在 stackoverflow 中查看这些答案在 RecyclerView 中隐藏视图


1
投票
现在您可以轻松删除特定的子项

(1)- 第一步创建方法复制以下代码:

private void deleteRef(String id) { databaseRef.child(id).removeValue(); }

(2) - 第二步在您想要的位置调用此方法,例如下面的

AlertDialog

 中的警报对话框或 firebase 回收器适配器:

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)- 点击监听器的最后一步:

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

0
投票
如果您没有使用 FirebaseRecyclerAdapter 那么您应该在删除按钮或警报对话框中尝试此代码。 :

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Users"); Query query = ref.orderByChild("status").equalTo(usr.getStatus()); ValueEventListener listener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot ds : dataSnapshot.getChildren()){ //remove ds.getRef().removeValue(); Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(DatabaseError databaseError) { } }; query.addValueEventListener(listener);
    
© www.soinside.com 2019 - 2024. All rights reserved.