如何在ListView中以及从Firebase中删除数据?

问题描述:

我正在使用一个Android应用程序,该应用程序将药品清单保存在Firebase中.所有清单均完美保存在Firebase上.我访问过的链接是

I am working on an Android Application that saves the medicine Inventory in Firebase. All Inventory saved on Firebase perfectly. The Links i have visited are this this I showed all inventory in the list in the Android. Now What I want to do is delete the data item from the list by having a button again every list Item. Here is my XML code of list view

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:background="@drawable/bgcolor"
android:layout_height="match_parent">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:background="@drawable/bgcolor">

    <TextView
        android:id="@+id/tvmediname"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvname"
        android:layout_marginTop="14dp"
        android:paddingLeft="15dp"
        android:text="Name"
        android:textSize="20sp"
        tools:ignore="UnknownId" />

    <TextView
        android:id="@+id/tvmediusage"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tvmediname"
        android:layout_alignStart="@+id/tvmediname"
        android:layout_below="@+id/tvmediname"
        android:paddingLeft="15dp"
        android:text="Usage"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/tvmedigenre"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/tvmediname"
        android:layout_alignStart="@+id/tvmediname"
        android:layout_below="@+id/tvmediusage"
        android:paddingLeft="15dp"
        android:text="Company"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/tvexpdate"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/tvmedigenre"
        android:paddingLeft="15dp"
        android:text="Expiry Date"
        android:textSize="20sp" />

    <ImageButton
        android:id="@+id/btndelete"
        android:layout_width="90sp"
        android:layout_height="100sp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        app:srcCompat="@drawable/btndelt" />

</RelativeLayout>

这是我的检索活动,可从Firebase检索数据

Here is my retrieve activity that Retrieves the data From Firebase

public class RetreiveActivity extends AppCompatActivity {
ListView mylistView;
DatabaseReference db;
List<ClassMedicine> medicineList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_retreive);
    mylistView= findViewById(R.id.mylist);
    medicineList= new ArrayList<>();
    db= FirebaseDatabase.getInstance().getReference("medicines");

}

@Override
protected void onStart() {
    super.onStart();
    db.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            medicineList.clear();
            for (DataSnapshot medicineSnapshot:dataSnapshot.getChildren()){
                ClassMedicine classMedicine=medicineSnapshot.getValue(ClassMedicine.class);
                medicineList.add(classMedicine);
            }
            MedicineList adapter=new MedicineList(RetreiveActivity.this,medicineList);
            mylistView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

}

这是我的模型班级

public class ClassMedicine {
String medicineId;
String medicineName;
String medicineUsage;
String medicineGenre;
String mediDate;

public ClassMedicine(){
}
public ClassMedicine(String medicineId, String medicineName, String medicineUsage, String medicineGenre,String mediDate) {
    this.medicineId = medicineId;
    this.medicineName = medicineName;
    this.mediDate= mediDate;
    this.medicineUsage = medicineUsage;
    this.medicineGenre = medicineGenre;
}

public String getMedicineId() {
    return medicineId;
}

public String getMedicineName() {
    return medicineName;
}

public String getMedicineUsage() {
    return medicineUsage;
}

public String getMedicineGenre() {
    return medicineGenre;
}
public String getMediDate() {
    return mediDate;
}

}

这是我的列表活动

public class MedicineList extends ArrayAdapter<ClassMedicine> {
private Activity context;
private List<ClassMedicine> medicineList;
public MedicineList(Activity context,List<ClassMedicine> medicineList){
    super(context,R.layout.mylistlayout,medicineList);
    this.context=context;
    this.medicineList=medicineList;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    LayoutInflater inflater= context.getLayoutInflater();
    View listViewItems= inflater.inflate(R.layout.mylistlayout,null,true);
    TextView textViewName=listViewItems.findViewById(R.id.tvmediname);
    TextView textViewGenre=listViewItems.findViewById(R.id.tvmedigenre);
    TextView textViewUsage=listViewItems.findViewById(R.id.tvmediusage);
    TextView textViewDate= listViewItems.findViewById(R.id.tvexpdate);
    ClassMedicine classMedicine= medicineList.get(position);
    textViewName.setText(classMedicine.getMedicineName());
    textViewGenre.setText(classMedicine.getMedicineGenre());
    textViewUsage.setText(classMedicine.getMedicineUsage());
    textViewDate.setText(classMedicine.getMediDate());
    return listViewItems;
}

}

我想从列表中删除特定列表项.当列表项被删除时,特定数据也应从Firebase中删除

I want to do to delete a particular list Item from List. As the list item is deleted that particular data should also remove from the firebase

首先,您需要更改适配器类的实现,像下面一样创建一个内部ViewHolder类

First you need to change the implementation of your adapter class, create an inner ViewHolder class like below

public class ViewHolder {
        TextView textViewName;
        TextView textViewGenre;
        TextView textViewUsage;
        TextView textViewDate;
        ImageButton btnDelete;
        View itemView;
        int position;

        public ViewHolder(View view) {
            itemView = view;
            textViewName = view.findViewById(R.id.tvmediname);
            textViewGenre = view.findViewById(R.id.tvmedigenre);
            textViewUsage = view.findViewById(R.id.tvmediusage);
            textViewDate = view.findViewById(R.id.tvexpdate);
            btnDelete = view.findViewById(R.id.btndelete);

            // initialize all your views

        }

        public void setPosition(int position) {
            this.position = position;
        }


        public void bindViews() {
            ClassMedicine classMedicine = medicineList.get(position)
            textViewName.setText(classMedicine.getMedicineName());
            textViewGenre.setText(classMedicine.getMedicineGenre());
            textViewUsage.setText(classMedicine.getMedicineUsage());
            textViewDate.setText(classMedicine.getMediDate());
            btnDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   onDeleteItem(position);
                }
            });
        }

    }

在适配器类中添加以下方法

Add below method in your adapter class

private void onDeleteItem(int position) {
           ClassMedicine classMedicine = medicineList.get(position);
                DatabaseReference db = FirebaseDatabase.getInstance().getReference("medicines");
                db.child("medicines").addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                            ClassMedicine medicine = snapshot.getValue(ClassMedicine.class);
                            if (classMedicine.getMedicineId().equals(medicine.getMedicineId())) {
                                databaseReference.child("medicines").child(snapshot.getKey().toString()).removeValue();
                                medicineList.remove(position);
                                notifyDataSetChanged();
                                break;
                            }
                        }
                    }
                });
            }

然后相应地修改 getView 方法

@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            LayoutInflater inflater= context.getLayoutInflater();
            convertView = inflater.inflate(R.layout.mylistlayout,null,true);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.setPosition(position);
        holder.bindViews();
        return convertView;
}

注意:我刚刚写成伪代码,但是应该可以工作

Note : I have just written as pseudo code but should work

这是最后的适配器类,它是为您避免混淆

Here is the final adapter class, it is for you to avoid confustion

public class MedicineList extends ArrayAdapter<ClassMedicine> {
    private Activity context;
    private List<ClassMedicine> medicineList;
    public MedicineList(Activity context,List<ClassMedicine> medicineList){
        super(context,R.layout.mylistlayout,medicineList);
        this.context=context;
        this.medicineList=medicineList;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            LayoutInflater inflater= context.getLayoutInflater();
            convertView = inflater.inflate(R.layout.mylistlayout,null,true);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.setPosition(position);
        holder.bindViews();
        return convertView;
    }

    public class ViewHolder {
        TextView textViewName;
        TextView textViewGenre;
        TextView textViewUsage;
        TextView textViewDate;
        ImageButton btnDelete;
        View itemView;
        int position;

        public ViewHolder(View view) {
            itemView = view;
            textViewName = view.findViewById(R.id.tvmediname);
            textViewGenre = view.findViewById(R.id.tvmedigenre);
            textViewUsage = view.findViewById(R.id.tvmediusage);
            textViewDate = view.findViewById(R.id.tvexpdate);
            btnDelete = view.findViewById(R.id.btndelete);

            // initialize all your views

        }

        public void setPosition(int position) {
            this.position = position;
        }


        public void bindViews() {
            ClassMedicine classMedicine = medicineList.get(position)
            textViewName.setText(classMedicine.getMedicineName());
            textViewGenre.setText(classMedicine.getMedicineGenre());
            textViewUsage.setText(classMedicine.getMedicineUsage());
            textViewDate.setText(classMedicine.getMediDate());
            btnDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   onDeleteItem(position);
                }
            });
        }

    }

    private void onDeleteItem(int position) {
        ClassMedicine classMedicine = medicineList.get(position);
        DatabaseReference db = FirebaseDatabase.getInstance().getReference("medicines");
        db.child("medicines").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    ClassMedicine medicine = snapshot.getValue(ClassMedicine.class);
                    if (classMedicine.getMedicineId().equals(medicine.getMedicineId())) {
                        databaseReference.child("medicines").child(snapshot.getKey().toString()).removeValue();
                        medicineList.remove(position);
                        notifyDataSetChanged();
                        break;
                    }
                }
            }
        });
    }

}