通过 ListView 和 id 删除数据库项

Posted

技术标签:

【中文标题】通过 ListView 和 id 删除数据库项【英文标题】:Delete item of database via ListView and id 【发布时间】:2016-03-14 18:12:03 【问题描述】:

我有一个带有ListView 和我本地sql 数据库数据的android 应用程序。 现在我想用 ID 从我的数据库中删除一个项目。

我想长按任何一行,这应该会删除该项目。

 ListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() 
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 
// DELETE ACTION

但是如何获取我的数据库的项目 ID? 目前,我使用查询将 ID 保存在隐藏的 TextView 中,并通过 findviewbyid() 获取此 ID。

但这是正确的方法吗?

适配器:

public class DatabaseListAdapter extends BaseAdapter 

Context context;
ArrayList<DatabaseListItems> databaseList;


public DatabaseListAdapter(Context context, ArrayList<DatabaseListItems> list) 
    this.context = context;
    databaseList = list;


@Override
public int getCount() 
    return databaseList.size();


@Override
public Object getItem(int position) 
    return databaseList.get(position);


@Override
public long getItemId(int position) 
    return position;


@Override
public View getView(int position, View convertView, ViewGroup arg2) 
    DatabaseListItems databaseListItems = databaseList.get(position);


    if (convertView == null) 
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.custom_listview_item, null);

    

    TextView tvID = (TextView) convertView.findViewById(R.id.txtViewID);
    tvID.setText(databaseListItems.getID());

    return convertView;



【问题讨论】:

【参考方案1】:

让您的适配器实现 onItemLongClickListener。

public class DatabaseListAdapter extends BaseAdapter implements AdapterView.OnItemLongClickListener 

...

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 

    long itemID = databaseList.get(position).getID();

    //Perform delete

    return true;

因此,您可以像在 getView() 方法中一样访问项目的 ID。

【讨论】:

【参考方案2】:

创建一个带有 id 和 title 的模型类,并在 listview 中进行排序。例如。

public class Data
 private int id;
 private String title;

 public Data(int id,String title)
     this.id = id;
     this.title = title;

 
public int getId() 
    return id;

public void setId(int id) 
    this.id = id;

public String getTitle() 
    return title;

public void setTitle(String title) 
    this.title = title;


在您填写列表视图的位置执行此操作

list.add(new Data(1,"xyz"))

所以在点击事件里面

ListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() 
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 
   int id  = list.get(posttion).getId(); //you can get id like this

【讨论】:

【参考方案3】:

我建议您使用CursorAdapter 作为您的ListView。如果是这样,我建议您从bindView() 中的Cursor 对象获取id。使用 ViewHolder 模式将一些信息附加到您的 ListView 行。

class ViewHolder
TextView text;
ImageView image;
...
long id;

为其添加长ID并在长按时检索它。

【讨论】:

【参考方案4】:

基本上您的适配器应该有数据,该数据应该是要删除的项目的id,因此我们假设每个适配器都有一个名为dataArrayList 的数组列表,其中包含您的适配器数据,当我们单击该按钮时我们删除了 db 中的项目,所以它看起来像:

 deletebtn.setOnItemLongClickListener(->(position)

   Contact mContact = dataArrayList.get(position).getContact();
   deleteContact(mContact);

 //adapter this then we can remove the listview adapter row whose data
 //we just deleted in the db
    arrayAdapter.getItem(position);
    arrayAdapter.remove(toRemove);
    arrayAdapter.notifyDatasetChange();
  //finally we want to remove the arraylist data too from it

  dataArrayList.remove(position);



//Our Delete method in our database class

public void deleteContact(Contact contact) 
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
        new String[]  String.valueOf(contact.getID()) );
db.close();

【讨论】:

【参考方案5】:

创建 POJO 类的 item 或 id like

class info
    private String item;
    private int id;
    info(String item,int id)
        this.item = item;
        this.id = id;
    
    public setId(int id)
        this.id=id;
    
    public setItem(String item)
        this.item=item;
    
    public int getId()
        return id;
    
    public String getItem()
        return item;
     

并将对象存储到 ArrayList 中,以便您可以获取具有位置的特定项目的 ID

ArrayList.get(position).getId();
ArrayList.remove(position);
notifyDatasetChange();

简单你创建两个 ArrayList 之类的

ArrayList<String> mItem = new ArrayList<String>();
ArrayList<String> mId = new ArrayList<String>();

然后您可以获取特定位置的 id 并从 arraylist 中删除它们

mId.get(position);
mId.remove(position);
mItem.remove(position);
notifyDatasetChange();

【讨论】:

以上是关于通过 ListView 和 id 删除数据库项的主要内容,如果未能解决你的问题,请参考以下文章

如何删除android中的自定义列表视图项?

单击 ListView 上的删除按钮后删除 ListView 上的项目

动画删除 ListView 项

如何永久删除列表视图项?

VB中如何在listview添加内容以及删除选定项

通过相加删除重复项 [SQL]