簡體   English   中英

如何在ListView中以及從Firebase中刪除數據?

[英]How to delete data in ListView and also from Firebase?

我正在使用一個Android應用程序,該應用程序將葯品清單保存在Firebase中。 所有清單完美保存在Firebase上。 我訪問過的鏈接是 我顯示,在Android列表中的所有庫存。 現在,我要做的是通過在每個列表項上再次單擊一個按鈕來從列表中刪除數據項。 這是我的列表視圖的XML代碼

<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檢索數據

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中刪除

首先,您需要更改適配器類的實現,創建一個內部ViewHolder類,如下所示

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

然后相應地修改您的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;
}

注意:我只是寫成偽代碼,但應該可以工作

這是最后的適配器類,它是為您避免混淆

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM