2012-03-10 228 views
2

我從列表視圖中獲取SQLite的數據。我需要刪除這個項目時用戶點擊檢查
框並按刪除按鈕或只點擊複選框,
我不明白該怎麼做?這裏是我的示例代碼以供參考。如何從listView中刪除項目?

MyTable.java

public class MyTable extends ListActivity { 


MySQLiteHelper m=new MySQLiteHelper(this); 
@Override 
protected void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);  
    Intent intent = getIntent(); 
    setResult(RESULT_OK, intent);  
    ArrayAdapter<Model> adapter = new InteractiveArrayAdapter(this, 
      getModel()); 
    setListAdapter(adapter); 
} 


private List<Model> getModel() 
{ 

    List<Model> list = new ArrayList<Model>(); 
    final MySQLiteHelper m=new MySQLiteHelper(getBaseContext()); 
    final List<LocWiseProfileBeans> LocWiseProfile= m.getAllLocWiseProfile();  

    for (final LocWiseProfileBeans cn : LocWiseProfile) { 

    list.add((get(cn.getLocname()))); 
    //list.add(get(cn.getSelectedprofile())); 

    // Initially select one of the items 
    list.get(0).setSelected(true); 

    } 
    return list; 
} 
private Model get(String s) { 
    return new Model(s); 
} 

InteractiveArrayAdapter.java

public class InteractiveArrayAdapter extends ArrayAdapter<Model> { 

private final List<Model> list; 
private final Activity context; 

public InteractiveArrayAdapter(Activity context, List<Model> list) 
{ 
    super(context, R.layout.locprofile, list); 
    this.context = context; 
    this.list = list; 
} 

static class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View view = null; 

    if (convertView == null) { 


     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.locprofile, null); 

     final ViewHolder viewHolder = new ViewHolder(); 

     viewHolder.text = (TextView) view.findViewById(R.id.label); 
     viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 
     viewHolder.checkbox 
       .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

        @Override 
        public void onCheckedChanged(CompoundButton buttonView, 
          boolean isChecked) { 
         Model element = (Model) viewHolder.checkbox 
           .getTag(); 
         element.setSelected(buttonView.isChecked()); 

        } 
       }); 
     view.setTag(viewHolder); 
     viewHolder.checkbox.setTag(list.get(position)); 

    } else { 

     view = convertView; 
     ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 

    } 


    ViewHolder holder = (ViewHolder) view.getTag(); 
    holder.text.setText(list.get(position).getName()); 
    holder.checkbox.setChecked(list.get(position).isSelected()); 


    return view; 
} 
} 

MySQliteHelper.java

public static final String TABLE_NAME = "loc_wise_profile"; 
public static final String TABLE_NAME2 = "supervisor"; 
public static final String COLUMN_ID = "_id"; 
public static final String COLUMN1 = "loc_name"; 
public static final String COLUMN2 = "lattitude"; 
public static final String COLUMN3 = "longitude"; 
public static final String COLUMN4 = "selectedprofile"; 
public static final String COLUMN5 = "contactno"; 
public static final String COLUMN6 = "message"; 
//public static final String COLUMN7 = "enabled"; 
public static final String COLUMN8 = "NotificeationMessage"; 

SQLiteDatabase db; 
private static final String DATABASE_NAME = "locale"; 
private static final int DATABASE_VERSION = 2; 

// Database creation sql statement 
private static final String DATABASE_CREATE = "create table IF NOT EXISTS " 
     + TABLE_NAME + "(" + COLUMN_ID 
     + " integer primary key autoincrement, " 
     + COLUMN1 + " text not null, " 
     + COLUMN2 + " double not null, " 
     + COLUMN3 + " double not null, " 
     + COLUMN4 + " text not null ," 
     + COLUMN5 + " text not null ," 
     + COLUMN6 + " text not null ," 
     //+ COLUMN7 + " text not null ," 
     + COLUMN8 + " text not null " 
     + ");"; 



public MySQLiteHelper(Context context) 
{ 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void onCreate(SQLiteDatabase database) { 
    // TODO Auto-generated method stub 
    database.execSQL(DATABASE_CREATE); 
    //database.execSQL(DATABASE_CREATE2); 
} 


    // Adding new Location wise Profile 
public void insertLocWiseProfile(LocWiseProfileBeans loc) { 
    db= this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(COLUMN1, loc.getLocname()); // Contact Name 
    values.put(COLUMN2, loc.getLattitude()); // Contact Phone Number 
    values.put(COLUMN3, loc.getLongitude()); 
    values.put(COLUMN4, loc.getSelectedprofile()); 
    values.put(COLUMN5, loc.getContactno()); 
    values.put(COLUMN6, loc.getMessage()); 
    //values.put(COLUMN7, loc.getEnabled()); 
    values.put(COLUMN8, loc.getNotificationMessage()); 
    // Inserting Row 
    db.insert(TABLE_NAME, null, values); 
    db.close(); // Closing database connection 
} 



    // Getting All Contacts 
public List<LocWiseProfileBeans> getAllLocWiseProfile() { 
    List<LocWiseProfileBeans> LocWiseProfileList = new ArrayList<LocWiseProfileBeans>(); 
    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_NAME; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 
      LocWiseProfileBeans loc= new LocWiseProfileBeans(); 
      //loc.set 
      loc.setId(cursor.getInt(0)); 
      loc.setLocname(cursor.getString(1)); 
      loc.setLattitude(cursor.getDouble(2)); 
      loc.setLongitude(cursor.getDouble(3)); 
      loc.setSelectedprofile(cursor.getString(4)); 
      loc.setContactno(cursor.getString(5)); 
      loc.setMessage(cursor.getString(6)); 
      // loc.setEnabled(cursor.getString(7)); 
      // Adding contact to list 
      LocWiseProfileList.add(loc); 
     } while (cursor.moveToNext()); 
    } 

    // return contact list 
    return LocWiseProfileList; 
} 


@Override 
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { 
    // TODO Auto-generated method stub 
    Log.w(MySQLiteHelper.class.getName(), "Upgrading database from version " 
      + oldVersion + " to " + newVersion 
      + ", which will destroy all old data"); 
    database.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
    onCreate(database); 
} 
public void delete(int value) 
{ 
    try{    
     SQLiteDatabase db= this.getWritableDatabase(); 
     db.delete(TABLE_NAME, COLUMN_ID+"="+value, null); 

} 
    catch(Exception e){} 

} 


public void deleteAll(){ 
    try{ 
    //db.execSQL("delete * from "+ TABLE_NAME); 

     SQLiteDatabase db= this.getWritableDatabase(); 
     db.delete(TABLE_NAME, null, null); 

    }catch(Exception e){} 
} 

} 

回答

1

您需要更改從getView原型:

public View getView(int position, View convertView, ViewGroup parent) 

public View getView(final int position, View convertView, ViewGroup parent) 

然後添加到您的viewHolder.checkbox.setOnCheckedChangeListener聽衆:

Model element = (Model) viewHolder.checkbox.getTag(); 
element.setSelected(buttonView.isChecked()); 
InteractiveArrayAdapter.this.remove(InteractiveArrayAdapter.this.getItem(position)); 
list.remove(position); //here consider whether you can afford changing list 
// If you want to add code to remove the element from the database too 

我還沒有嘗試過自己,但它似乎會起作用。

編輯:按照您的要求我加入的代碼刪除數據庫中的條目:

在你MySQliteHelper類中添加下面的方法:

public void deleteByName(String name) {   
    SQLiteDatabase db= this.getWritableDatabase(); 
    db.delete(TABLE_NAME, COLUMN1 +"=?", new String [] { name }); 
    db.close(); 
} 

然後改變的代碼聽衆:

Model element = (Model) viewHolder.checkbox.getTag(); 
element.setSelected(buttonView.isChecked()); 
InteractiveArrayAdapter.this.remove(InteractiveArrayAdapter.this.getItem(position)); 

MySQLiteHelper m = new MySQLiteHelper(InteractiveArrayAdapter.this.context); 
m.deleteNyName(list.get(position).toString()); 
list.remove(position); //here consider whether you can afford changing list 

這裏我假設你的名字是獨一無二的。如果這不是真的,你需要重構你的Model類(順便說一句,這已經太混亂了,我只是瘋狂地猜測model.toString()將返回名稱的字符串)。

+1

我需要從數據庫中刪除它。但是如何匹配數據庫記錄_id的位置?請給我一些刪除數據庫的代碼。謝謝 – 2012-03-10 09:03:46

+0

當我點擊一個項目它刪除所有項目? – 2012-03-10 09:06:45

+0

關於第二條評論:你的意思是那個結果,或者那是你的預期行爲?順便說一句,我糾正了一下我的代碼。 – 2012-03-10 09:09:58

1

OnListItemClick只是刪除列表元素像...

list.remove(position) 

,然後就refresh您使用adpter.notifyDataSetChanged();

,並從數據庫從中獲取值或使用位置刪除列表視圖。