2011-12-07 37 views
8

Tôi đang sử dụng CursorAdapter trở xuống là lớp bộ điều hợp của mình. Danh sách của tôi bao gồm hai chế độ xem văn bản và một nút trên mỗi hàng. Bây giờ, khi nhấp vào nút, tôi muốn xóa mục đã chọn khỏi danh sách cũng như từ cơ sở dữ liệu. Làm thế nào tôi có thể nhận được id của mục đã chọn từ cơ sở dữ liệu để tôi có thể xóa nó và sau đó thông báo cho bộ điều hợp (làm mới danh sách).Cách xóa mục đã chọn khỏi ListView bằng CursorAdapter

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

Theo listview ràng buộc bạn với con trỏ và nếu bạn đang quản lý con trỏ với hoạt động đó trở đi onListItemClick mang đến cho bạn _ID mà bạn muốn nhưng ở đây bạn đang cố gắng để có được một _ID nhấp vào nút trong bindView sau đó bạn phải lấy ID tại trước khi bấm nút của bạn bằng cách sử dụng tên cột _ID và chuyển nó vào nút bấm của bạn, và sử dụng nó .. :-) – user370305

Trả lời

12

Hãy thử một số điều như thế này:

@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 Cool câu trả lời. – Venky

+1

+1 Đẹp nhất. Rất hữu ích cho tôi. – Praveenkumar

+3

'cursor.requery()' hiện không còn được dùng nữa – Sergii

2

Giả sử ID này nằm trong con trỏ. Sau đó, chỉ cần tạo lớp DeleteEntryOnClicklistener của riêng bạn, thực hiện OnClickListener và để cho nó lấy ID trong hàm tạo của nó và xóa mục nhập khi được bấm.

hãy bình luận nếu tôi đã hiểu lầm vấn đề của bạn hoặc nếu Im không rõ ràng, cheers :)

chỉnh sửa:

Trong bindView() của bạn, thay đổi OnClickListener một cái gì đó như thế này:

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

DeleteEntryOnClicklistener sẽ trông giống như sau:

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

có bạn đúng, id của tôi là trong con trỏ và tôi muốn tìm nạp id từ mục được chọn, vì vậy cách thực hiện điều đó. –

+0

Tôi đã chỉnh sửa câu trả lời của mình một chút, có lẽ bây giờ nó đã rõ ràng hơn một chút so với cách tôi tưởng tượng mã. – pgsandstrom

+0

hmmm có vẻ tốt, làm cách nào để điền lại danh sách hoặc làm mới danh sách? –

Các vấn đề liên quan