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.