gpt4 book ai didi

java - “如何删除 sqlite 数据库中正确的 ListView 项目

转载 作者:行者123 更新时间:2023-12-02 04:33:34 25 4
gpt4 key购买 nike

我想从数据库中删除 ListView 项目,如何正确链接每个列表项目及其数据库项目?

我已经尝试删除 _id 为列表位置的位置,但每次都无法正常工作。

这是 viewholder 类和 getView 方法,我在适配器类上实现监听器

  private class ViewHolder{
ImageView imageView;
TextView nom;
Button actualizar,borrar;
}

@Override
public View getView(final int position, View view, ViewGroup parent) {
View fila=view;
ViewHolder holder=new ViewHolder();


if(fila==null)
{
LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
fila=inflater.inflate(layout,null);
holder.imageView=fila.findViewById(R.id.imagencoche);
holder.nom=fila.findViewById(R.id.nombreCoche);
holder.actualizar=fila.findViewById(R.id.btnAct);
holder.borrar=fila.findViewById(R.id.btnBorrar);

holder.borrar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyOpenHelper db=new MyOpenHelper(context);
db.borrarCoche(position+1+"");

lista=db.selectCoches();
notifyDataSetChanged();


}
});

fila.setTag(holder);
}
else{
holder=(ViewHolder)fila.getTag();

}
Coche coche=lista.get(position);


holder.nom.setText(coche.getNombre());
holder.imageView.setImageBitmap(coche.getFoto());

return fila;
}


从 SQLite 助手调用的 2 个方法

 public  void borrarCoche(String id)
{

String where="_id=?";
SQLiteDatabase db=this.getWritableDatabase();

db.delete("coches",where,new String[]{id});
}

public ArrayList<Coche> selectCoches(){
ArrayList<Coche> lista =new ArrayList<Coche>();

SQLiteDatabase db=this.getReadableDatabase();
Cursor c =db.rawQuery("SELECT nombre, foto, longitud, latitud,_id from coches", null);

if (c.moveToFirst()){
do {
//recogemos valores
String nom = c.getString(0);
byte[] foto = c.getBlob(1);
float longitud = c.getFloat(2);
float latitud = c.getFloat(3);
int id = c.getInt(4);
Coche coche = new Coche(id, longitud, latitud, DbBitMapUtility.getImage(foto), nom);
lista.add(coche);


}while(c.moveToNext());


}

return lista;

}

它并不总是正常工作,有时它会删除另一个条目,或者当只剩下 2 或 1 个条目时,它不会删除任何内容。

最佳答案

首先,我认为每次删除项目时都不需要从数据库中调用项目。相反,您可以从数据库中删除该项目,然后从列表中删除该项目并调用notifyDatasetChanged()。

此外,不要在 getView() 方法中调用监听器,而是在 ViewHoder 类或 onBindViewHolder() 中调用它。所以逻辑将是这样的:

public class MyViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView nom;
Button actualizar,borrar;

public MyViewHolder(View view) {
super(view);
holder.imageView=fila.findViewById(R.id.imagencoche);
holder.nom=fila.findViewById(R.id.nombreCoche);
holder.actualizar=fila.findViewById(R.id.btnAct);
holder.borrar=fila.findViewById(R.id.btnBorrar);
}
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.movie_list_row, parent, false);

return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Coche coche = cocheList.get(position); //Where ArrayList<Coche> cocheList;
holder.nom.setText("demo text");

holder.borrar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyOpenHelper db=new MyOpenHelper(context);
db.borrarCoche(cocheList.getId()); //Don't use position as this is not id rather this is item index value.

cocheList.remove(position);
notifyDataSetChanged();
}
});
}

希望您能得到解决方案。

为了更好地了解您可以关注https://www.androidhive.info/2016/01/android-working-with-recycler-view/了解 Android 中 RecyclerView 的基本概念。

关于java - “如何删除 sqlite 数据库中正确的 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56562796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com