【问题标题】:Delete item of database via ListView and id通过 ListView 和 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;
}

}

【问题讨论】:

    标签: android sqlite android-listview


    【解决方案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();
            

            【讨论】:

              猜你喜欢
              • 2015-02-27
              • 2020-08-25
              • 1970-01-01
              • 2012-01-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-20
              • 2018-11-19
              相关资源
              最近更新 更多