2011-12-07 32 views
8

Estoy usando CursorAdapter y debajo está mi clase de adaptador. Mi lista consiste en dos vistas de texto y un botón en cada fila. Ahora, al hacer clic en el botón, quiero eliminar el elemento seleccionado de la lista y de la base de datos. ¿Cómo puedo obtener el id del elemento seleccionado de la base de datos para poder eliminarlo y luego notificar al adaptador (actualizar la lista)?Cómo eliminar un elemento seleccionado de ListView usando 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

Como por su aprieto vista de lista con el cursor y si está administrando el cursor con la actividad de entonces onListItemClick le da la _ID que desea, pero aquí se está tratando de obtener un _ID en el botón haga clic en bindView, entonces tiene que buscar la identificación antes del clic de su botón con el nombre de la columna _ID y pasarla al clic de su botón, y usarla ... :-) – user370305

Respuesta

12

Pruebe algo como esto:

@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 answer. – Venky

+1

+1 Agradable. Muy útil para mi – Praveenkumar

+3

'cursor.requery()' está en desuso ahora – Sergii

2

Supongo que esta ID está en el cursor. Luego, simplemente crea tu propia clase DeleteEntryOnClicklistener que implementa OnClickListener y deja que tome la ID en su constructor, y borra la entrada cuando se hace clic.

favor comentar si he entendido mal su problema o si estoy siendo poco clara, alegre :)

edición:

En su bindView(), cambiar el OnClickListener a algo como esto:

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

Y DeleteEntryOnClicklistener debería verse algo como esto:

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

sí, tiene razón, mi identificación está en el cursor y quiero buscar la identificación del artículo que se selecciona, entonces cómo hacer eso. –

+0

He editado mi respuesta un poco, quizás ahora esté un poco más claro cómo imaginé el código. – pgsandstrom

+0

hmmm que parece estar bien, ¿qué hay de volver a llenar la lista o actualizar la lista? –

Cuestiones relacionadas