2011-12-07 85 views
8

我使用的是CursorAdapter,下面是我的適配器類。我的列表由兩個文本視圖和每行一個按鈕組成。現在,點擊按鈕我想從列表中以及從數據庫中刪除選定的項目。如何從數據庫中獲取所選項目的ID,以便我可以將其刪除,然後通知適配器(刷新列表)。如何使用CursorAdapter從ListView中刪除選定項目

public class MyAdapter extends CursorAdapter { 

    Cursor c; 
    LayoutInflater inflater; 
    Context context; 
    private String TAG = getClass().getSimpleName(); 

    public MyAdapter(Context context, Cursor c) { 
     super(context, c); 
     this.c = c; 
     this.context = context; 
     inflater = LayoutInflater.from(context); 
    } 

    @Override 
    public void bindView(View view, Context context, final Cursor cursor) { 

     TextView txtName = (TextView) view.findViewById(R.id.txt_name); 
     txtName.setText(cursor.getString(cursor.getColumnIndex(Helper.tbl_col_username))); 
     TextView txtPassword = (TextView) view.findViewById(R.id.txt_password); 
     txtPassword.setText(cursor.getString(cursor.getColumnIndex(Helper.tbl_col_password))); 

     Button button = (Button) view.findViewById(R.id.btn_delete); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View arg0) { 
       Log.d(TAG, "Button Click "); 
      } 
     }); 
    } 
    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = inflater.inflate(R.layout.row, null); 
     return v; 
    } 
} 
+0

根據你的ListView綁定光標,如果你是與當時的onListItemClick管理活動中的光標給你要,但_ID在這裏你試圖讓一個_ID在按鈕的bindView點擊,然後你必須在你的按鈕的點擊之前使用_ID列名獲取ID,並將它傳遞到你的按鈕的點擊,並使用它.. :-) – user370305

回答

12

嘗試一些事情是這樣的:

@Override 
public void bindView(View view, Context context, final Cursor cursor) { 

    TextView txtName = (TextView) view.findViewById(R.id.txt_name); 
    txtName.setText(cursor.getString(cursor.getColumnIndex(Helper 
                  .tbl_col_username))); 
    TextView txtPassword = (TextView) view.findViewById(R.id.txt_password); 
    txtPassword.setText(cursor.getString(cursor.getColumnIndex(Helper 
                  .tbl_col_password))); 

    final String itemId = cursor.getString(cursor.getColumnIndex("id")); 

    Button button = (Button) view.findViewById(R.id.btn_delete); 
    button.setOnClickListener(new OnClickListener() { 

     public void onClick(View arg0) { 
      Log.d(TAG, "Button Click "); 
      deleteRecordWithId(itemId); 
      cursor.requery(); 
      notifyDataSetChanged(); 
     } 
    }); 
} 
+2

+1很酷的答案。 – Venky

+1

+1不錯的一個。對我非常有用。 – Praveenkumar

+3

'cursor.requery()'現在已被棄用 – Sergii

2

我假設這個ID在遊標中。然後,簡單地創建自己的類DeleteEntryOnClicklistener,它實現了OnClickListener,並讓它在其構造函數中使用該ID,並在單擊時刪除條目。

請評論,如果我誤解了你的問題,如果我是在不清楚,歡呼:)

編輯:

在你bindView(),改變OnClicklistener到這樣的事情:

long id = cursor.getLong(cursor.getColumnIndex(Helper.tbl_col_id)); 
button.setOnClicklistener(new DeleteEntryOnClicklistener(id)); 

DeleteEntryOnClicklistener應該看起來像這樣:

public class DeleteEntryOnClicklistener implements View.OnClickListener { 

    long id; 

    public DeleteEntryOnClicklistener(long id) { 
     this.id = id; 
    } 

    @Override 
    public void onClick(View v) { 
     database.deleteEntry(id); 
    } 

} 
+0

是的你是對的,我的ID是在光標並且我想從所選項目中獲取ID,那麼該怎麼做。 –

+0

我編輯了一下我的答案,或許現在我想象的代碼更清晰了。 – pgsandstrom

+0

嗯,似乎很好,如何重新填充列表或刷新列表? –

相關問題