问题
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
回答1:
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;
}
}
}
});
}
}
来源:https://stackoverflow.com/questions/51906903/how-to-delete-data-in-listview-and-also-from-firebase