2015-02-08 98 views
-1

一些其他項目。如果我從listView假設item_no = 5刪除一個項目,那麼一些其他項目會從數據庫中,其id刪除是 5.刪除項目將刪除SQLite數據庫

這裏是我的代碼。

我的數據庫類TRDBHelper.class

//Get single reminder 
Cursor getReminder(int id){ 

    SQLiteDatabase db = this.getReadableDatabase(); 

    Cursor cursor = db.query(TABLE_NAME, new String[]{COLUMN_ID, COLUMN_TITLE, COLUMN_DES, 
          COLUMN_DATE, COLUMN_TIME}, COLUMN_ID + "=?", 
          new String[]{String.valueOf(id)}, null, null, null, null); 
    if(cursor != null) 
     cursor.moveToFirst(); 

    return cursor; 
} 

//Get all reminders 
public List<TRListFormat> getAllReminders(){ 

    List<TRListFormat> remList = new ArrayList<>(); 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery("select * from " + TABLE_NAME, null); 

    if(cursor.moveToFirst()){ 
     do { 
      TRListFormat format = new TRListFormat(); 
      format.setId(Integer.parseInt(cursor.getString(0))); 
      format.setTitle(cursor.getString(1)); 
      format.setDes(cursor.getString(2)); 
      format.setDate(cursor.getString(3)); 
      format.setTime(cursor.getString(4)); 

      remList.add(format); 
     } while(cursor.moveToNext()); 
    } 
    return remList; 
} 

//Delete single reminder 
public void deleteReminder(int id){ 

    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete(TABLE_NAME, COLUMN_ID + " = ?", new String[]{ String.valueOf(id)}); 
    db.close(); 
} 

我的列表視圖TRList.class

我使用SimpleAdapter在ListView和TRListForamat類具有所有getter和setter方法。當listView項目被點擊

ListView lv; 
SimpleAdapter adapter; 
ArrayList<HashMap<String, String>> items; 
List<TRListFormat> list; 
TRDBHelper trDb; 

public void refreshList() { 
    items = new ArrayList<>(); 
    list = trDb.getAllReminders(); 

    for (TRListFormat val : list) { 
     HashMap<String, String> map = new HashMap<>(); 
     map.put("title", val.getTitle()); 
     map.put("description", val.getDes()); 
     map.put("date", val.getDate()); 
     map.put("time", val.getTime()); 

     items.add(map); 
    } 
    adapter = new SimpleAdapter(this, items, R.layout.tr_list_format, 
      new String[]{"title", "description", "date", "time"}, 
      new int[]{R.id.tbr_title, R.id.tbr_des, R.id.tbr_date, R.id.tbr_time}); 

    lv = (ListView) findViewById(R.id.tbr_list); 
    lv.setAdapter(adapter); 
} 

new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialogInterface, int i) { 

    int remId = (int)id + 1; //id is a value from public void onItemClick(final AdapterView<?> adapterView, View view, final int position, final long id) 
           //I also tried using position instead of id but both gives same result 
    adapter.getItem(remId); 
    adapter.getClass(); 

    Cursor rs = trDb.getReminder(remId); 
    String id = rs.getString(rs.getColumnIndex(TRDBHelper.COLUMN_ID)); 
    String title = rs.getString(rs.getColumnIndex(TRDBHelper.COLUMN_TITLE)); 

    trDb.deleteReminder(Integer.parseInt(id)); 

    Toast.makeText(getApplicationContext(), "id: "+id+" title:"+title+" deleted", Toast.LENGTH_SHORT).show(); 

    refreshList(); 
} 

,彈出刪除按鈕被設置在AlertDialog什麼變化,我需要從列表視圖和數據庫中刪除相同的項目呢?

是否可以用SimpleAdapter或我需要使用SimpleCursorAdapter

+0

'INT remId =(int)的ID + 1;'從你在哪裏得到'id'價值? – Ziem 2015-02-08 11:13:32

+0

@Ziem謝謝你看看我的問題。 'id'是'onItemClickListener'的參數值。'公共無效onItemClick(最終AdapterView adapterView,視圖視圖,最終詮釋位置,最終長ID)'我也嘗試使用'位置'而不是'ID'但都給出了相同的結果 – Apurva 2015-02-08 11:17:00

+0

'onItemClickListener' ID參數不會給你一個除非你在你的適配器中實現'getItemId(int position)'。您可能需要擴展SimpleAdapter並重寫此方法。 – JonasCz 2015-02-08 11:25:46

回答

1

您可以在項目中添加id並將其作爲隱藏文本視圖。

map.put("id", val.getId()); 

和SimpleAdapter中。

以後你可以用它來獲得點擊項目

mListView.setOnItemClickListener(new OnItemClickListener() { 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
{ 
    HashMap<String, Object> obj = (HashMap<String, Object>) adapter.getItem(position); 
    String id = (String) obj.get("id"); 

    //delete remider by id 
    trDb.deleteReminder(Integer.parseInt(id)); 
} 
}); 
+0

太棒了!我工作了幾天。 – Apurva 2015-02-08 20:13:35

1

當使用SimpleAdapter行ID與位置:SimpleAdapter.java#106相同。在你的情況下:remId總是position + 1

要讓我建議擴大BaseAdapter更多的控制權:

public class MyAdapter extends BaseAdapter { 
    private Context mContext; 
    private List<TRListFormat> mList; 

    public MyAdapter(Context context, List<TRListFormat> list) { 
     mContext = context; 
     mList = list; 
    } 

    @Override 
    public int getCount() { 
     if (mList != null) { 
      return mList.size(); 
     } else { 
      return 0; 
     } 
    } 

    @Override 
    public TRListFormat getItem(int position) { 
     return mList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return getItem(position).getId(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     //todo create your view 
     return null; 
    } 
} 

現在OnItemClickListener將返回值正確的ID。

編輯:

如果你不想使用BaseAdapter可以覆蓋SimpleAdapter getItemId方法。

首先添加ID映射:

for (TRListFormat val : list) { 
    HashMap<String, String> map = new HashMap<>(); 
    map.put("id", val.getId()); 
    .... 
} 

下一頁覆蓋getItemId(不是最好的解決辦法,但它應該工作):

SimpleAdapter simpleAdapter = new SimpleAdapter(...) { 
    @Override 
    public long getItemId(int position) { 
     return Long.valueOf(((Map<String,String>) getItem(position)).get("id")); 
    } 
}; 
+0

如何在我的代碼中使用這個類? – Apurva 2015-02-08 11:37:48

+0

用這個替換你的SimpleAdapter。不要忘記在'getView'方法中創建你的視圖。 – Ziem 2015-02-08 12:49:04

+0

我遠離'BaseAdapter',因爲我不想實現'getView()' – Apurva 2015-02-08 16:41:53

1

在你TRDBHelper.class添加這個方法:

public int getItemIdByPosition(int position) { 
    cursor.moveToPosition(position); 
    return Integer.parseInt(cursor.getString(0)); 
} 

在您的listView的onItemClickListener中調用此方法的位置,以及你會有很好的身份證件。

+0

這需要光標長時間打開。不太好意思。 – Marcus 2015-02-08 12:02:41

+0

我想你可以在需要時重新打開遊標,但爲什麼不好呢? – JonasCz 2015-02-08 12:09:31

+0

由於打開的遊標綁定了資源,因此應該在需要時打開它們,然後適當關閉 – Marcus 2015-02-08 12:11:24