简体   繁体   中英

How to delete data in ListView and also from 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>

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

        }
    });
}

}

Here is my Model Class

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;
}

}

Here is my List Activity

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;
}

}

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

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

Then modify your getView method accordingly

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

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM