Problema al obtener dato de un Item del List view, cuando el Adapter es llenado por un Cursor

publicado por: Anonymous

En mi actividad principal mainActivity muestro un listview de los datos de mi base de datos local en SQlite consultados a través de una clase DataBaseHelper, donde creó la base de datos y una clase SQLcontrolle donde esta el metodo cursor readData que es finalmente la consulta en si, la consulta y el despliegue de la misma se efectúan perfectamente.

Hora lo que intento es que al momento que le den click al ITEM se muestre un mensaje con el ID o la posición o en su defecto el “ID” correspondiente al registro en la lista, esto es lo que tengo hasta ahora de código:

Al darle click al ITEM me lanza Se ha detenido la aplicacion
del registro seleccionado:

MainActivity.java (Actualizado 28-02)

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    dbcon = new SQLController(this);
    dbcon.open();
    lv = (ListView) findViewById(R.id.listView);


    Cursor cursor = dbcon.readData();
    String[] from = new String[] { DatabaseHelper.IDs,    DatabaseHelper.MSG};
    int[] to = new int[] { R.id.ids, R.id.msg};


    SimpleCursorAdapter adapter = new SimpleCursorAdapter(
            MainActivity.this, R.layout.list_item, cursor, from, to);
    Firm = (RadioButton) findViewById(R.id.firma);

    adapter.notifyDataSetChanged();
    lv.setAdapter(adapter);

    lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            int itemPosition     = position;
            String  itemValue    = (String)   lv.getItemAtPosition(position);
            // Show Message
            Toast.makeText(getApplicationContext(),
                    "Position :"+itemPosition+"  ListItem : " +itemValue , Toast.LENGTH_LONG)
                    .show();
        }
    });

.
.
La clase SQLController donde esta el metodo cursor Read Data

SQLControler.java

public class SQLController {

private DatabaseHelper DatabaseHelper;
private Context ourcontext;
private SQLiteDatabase database;

public SQLController(Context c) {
    ourcontext = c;
}

public SQLController open() throws SQLException {
    DatabaseHelper = new DatabaseHelper(ourcontext);
    database = DatabaseHelper.getWritableDatabase();
    return this;

}

//Getting Cursor to read data from table
public Cursor readData() {
    String[] allColumns = new String[] { DatabaseHelper.IDs, DatabaseHelper.MSG };
    Cursor c = database.query(DatabaseHelper.TABLE_NAME, allColumns, null,
            null, null, null, DatabaseHelper.IDs+" DESC",null);
    if (c != null) {
        c.moveToFirst();
    }
    return c;
}

Y por ultimo DatabaseHelper donde creo la base de datos:

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "GCM";
public static final String TABLE_NAME = "newsTable";
public static final String IDs = "_id";
public static final String MSG = "MESSAGE";
public static final String FIRMA = "firma";
public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    // TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + IDs + " INTEGER PRIMARY KEY AUTOINCREMENT, " + MSG + " STRING, " + FIRMA + " STRING)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

Cualquier ayuda, sugerencia y comentario se los agradesco de antemano, gracias por su atención

solución

Creo que usted esta obteniendo el ultimo registro porque usted usa “DESC” y despues hace -> String ids= cursor.getString(0); y este no veo que cambie en ningun momento siempre se consulta sobre 0, y este es el ultimo registro por “desc” | cursor.getString ()


Yo no se como usted esta manejando el Checkbox, en relacion con el ListView, pero usted podria tratar de obtener la posicion con algo asi:

final ListView lv = (ListView) findViewById(R.id.ListView01);

lv.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView<?> myAdapter, View myView,
                              int myItemInt, long mylng) {

        int sList = lv.getItemAtPosition(myItemInt);

        /*   Aqui puede obtener el item selecionado 
         *  y usarlo para mostrar el mensaje que le
         *  corresponda en lugar de usar el 0 pasandolo
         *  de alguna manera
         *
         *  Nota: Puede que tenga que tener en cuenta la position que le 
         * corresponde a cada item y si esta es la misma para la consulta
         * a la BD porque usted usa desc y no se si lo item se iran 
         * añadiendo de forma dinamica, y tenga que hacer alguna
         * operacion matematica para que la position que obtenga
         * corresponda con el id de la consulta, espero me entienda,
         * aunque es posible que le funcione bien de la forma que esta,
         * pero se lo dejo como observacion
         */ 
      }                 
});

Con este metodo puede consultar la posicion del item selecionado y usarlo en de alguna manera String ids= cursor.getString(position);

public void onItemClick(AdapterView<?> arg0, View arg1, 
                        int position, long arg3) {      
}

list.setClickable(true);

http://developer.android.com/intl/es/reference/android/widget/AdapterView.OnItemClickListener.html

http://developer.android.com/intl/es/reference/android/widget/ListView.html


Como digo yo no se de que manera tiene implementado el listView, esto es solo una idea al ver lo que muestra, pero igual (que no se si esta si lo tiene asi) puede poner el checkbox dentro del holder:

Algo asi:

holder.name = (CheckBox) convertView.findViewById(R.id.checkBox1);
   convertView.setTag(holder);

    holder.name.setOnClickListener( new View.OnClickListener() {

     public void onClick(View v) {  

      CheckBox cb = (CheckBox) v ;  

      Toast.makeText(getApplicationContext(),
                     "Clicked on Checkbox: " + cb.getText() +
                     " is " + cb.isChecked(), 
                     Toast.LENGTH_LONG).show();

     /*
      *Implementar aqui el manejo del cursor
      */
     }  

Pero solo es una idea le dejo un link completo sobre la forma anterior, la puede mirar y determinar si le es mas comoda o no, pues solo usted y dios sabe que esta haciendo ahora mismo y cual es su idea.

Espero le ayude.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *