He creado una aplicación en la que el listview rellena a partir de la base de datos.Ahora quiero ver en un brindis con los detalles de la valor de una fila que se hace clic en. ¿Cómo puedo obtener los datos de la fila pulsada??

Debajo de mi .página java..

public class ListviewActivity extends ListActivity{

ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    //TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listlayout);
    mListView=(ListView)findViewById(R.id.list);

     DbAdapter dbHelper = new DbAdapter(this);
        dbHelper.open();

        //Get a Cursor for the list items
        Cursor listCursor = dbHelper.fetchListItems();
        startManagingCursor(listCursor);

        //set the custom list adapter
        setListAdapter(new MyListAdapter(this, listCursor));

        mListView = getListView();
        mListView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position,long id){
                String val=(String)(mListView.getItemAtPosition(position));

                Toast.makeText(ListviewActivity.this,position, Toast.LENGTH_SHORT).show();

            }
        });


}

Cuando hago clic en una fila de la aplicación es cerrada por la fuerza con los siguientes errores:

E/AndroidRuntime(13011): FATAL EXCEPTION: main
E/AndroidRuntime(13011): java.lang.ClassCastException: android.database.sqlite.SQLiteCursor
E/AndroidRuntime(13011):    at com.android.pickuplistview.ListviewActivity$1.onItemClick(ListviewActivity.java:38)
E/AndroidRuntime(13011):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
E/AndroidRuntime(13011):    at android.widget.ListView.performItemClick(ListView.java:3382)
E/AndroidRuntime(13011):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
E/AndroidRuntime(13011):    at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(13011):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(13011):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(13011):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(13011):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(13011):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(13011):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(13011):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(13011):    at dalvik.system.NativeStart.main(Native Method)

Mi DB Adaptador página está aquí:

public class DbAdapter {
private static final String DB_NAME = "ListData";
private static final String TABLE_ITEMS = "itemslist";
public static final String COL_ID = "_id";
public static final String COL_ITEMS = "items";
public static final String COL_NAME = "name";
public static final String COL_ADDRESS = "address";
public static final String COL_STATUS="status";
private static final int DB_VERSION = 1;
private final Context mCtx;
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String CREATE_DB_TABLE_DATES = 
"CREATE TABLE "+TABLE_ITEMS+" ("+ 
COL_ID +" INTEGER PRIMARY KEY AUTOINCREMENT, "+ 
COL_ITEMS + " TEXT NOT NULL, " + 
COL_NAME + " TEXT, " + 
COL_ADDRESS + " TEXT, " +
COL_STATUS + " TEXT " +
");";
private static final String CREATE_TEST_DATA1 = 
"INSERT INTO "+TABLE_ITEMS+
" ("+
COL_ITEMS+","+
COL_NAME+","+
COL_ADDRESS+","+
COL_STATUS+
") VALUES (" +
"'Gems',"+
"'KAJU',"+
"'Behala',"+
"'DELIVERED'"+
");";
private static final String CREATE_TEST_DATA2 = 
"INSERT INTO "+TABLE_ITEMS+
" ("+
COL_ITEMS+","+
COL_NAME+","+
COL_ADDRESS+","+
COL_STATUS+
") VALUES (" +
"'Eclairs',"+
"'BIJU',"+
"'Joka',"+
"'PENDING'"+
");";
private static final String CREATE_TEST_DATA3 = 
"INSERT INTO "+TABLE_ITEMS+
" ("+
COL_ITEMS+","+
COL_NAME+","+
COL_ADDRESS+","+
COL_STATUS+
") VALUES (" +
"'Donut',"+
"'RAJU',"+
"'Kasba',"+
"'DELIVERED'"+
");";
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_DB_TABLE_DATES);
db.execSQL(CREATE_TEST_DATA1);
db.execSQL(CREATE_TEST_DATA2);
db.execSQL(CREATE_TEST_DATA3);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//if the new version is higher than the old version, 
//delete existing tables:
if (newVersion > oldVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_ITEMS);
onCreate(db);
} else {
//otherwise, create the database
onCreate(db);
}
}
}
/**
* Constructor - takes the context to allow the database to be
* opened/created
* 
* @param ctx the Context within which to work
*/
public DbAdapter(Context ctx) {
this.mCtx = ctx;
}
public DbAdapter open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
mDbHelper.close();
}
public Cursor fetchListItems() {
Cursor cursor = 
mDb.query(TABLE_ITEMS, new String[] 
{COL_ID, COL_ITEMS, COL_NAME, COL_ADDRESS, COL_STATUS}, 
null, null, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;
}

}

InformationsquelleAutor nexgen sam | 2013-05-13

2 Comentarios

  1. 2

    Parece que estás tratando de lanzar un Cursor a una Cadena:

    String val=(String)(mListView.getItemAtPosition(position));

    Al menos eso es lo que este error le hace ser:

    java.lang.ClassCastException: android.database.sqlite.SQLiteCursor

    Tratar de conseguir una representación de Cadena de los datos del Cursor, no perder el Cursor a una Cadena directamente.

    EDICIÓN:

    Un Cursor que contiene punteros a información almacenada en una base de datos. Sin saber cómo su base de datos está estructurada, que sería imposible para mí para hacer eso por usted. Sin embargo, usted puede probar este formato:

    String val = mListView.getItemAtPosition(position).getString(columnIndexInteger);

    Donde columnIndexInteger es el valor entero de la columna. Si usted no lo sabe, pero tiene un nombre de Cadena para ella, usted puede conseguir con: getColumnIndex(). Si ese es el caso, ajuste este:

    Cursor c = (Cursor)mListView.getItemAtPosition(position);
    String val = c.getString(c.getColumnIndex(DbAdapter.COL_NAME));

    La línea anterior debe establecer val a la base de datos de registro asociado con COL_NAME

    • Cómo hacer que?? por favor, dame un buen ejemplo o sería mejor si usted editar mi código.Estoy muy ameteur en android.Esperamos su ayuda.Por favor..
    • Echa un vistazo por encima
    • he adjuntado mi DB página…por favor revise por favor
    • He editado. El fondo debe establecer val a la base de datos de registro asociado con COL_NAME
    • cuando estoy tratando de editar como se sugiere por una red de error es bajo «getColumnIndex», que dice: «El método getColumnIndex(String) no está definido para el tipo de Objeto’
    • Me gustaría decir algo fuera d tema…he visto su perfil y su asombroso.Keep it up.Su muy apreciable de lo que están haciendo a esta edad.felicitaciones felicitaciones..
    • Gracias, he actualizado la línea de fondo con una versión más legible. El Cursor tiene un método getColumnIndex(String) que devuelve el índice basado en 0 de la fila dentro del Cursor que se define por la Cadena que se pasa. Trate de usar las dos líneas de arriba
    • un nuevo error en marca bajo la línea de mListView.getItemAtPosition(posición); «no coincide el Tipo: no se puede convertir de Objeto con el Cursor»
    • ahora si puedo añadir fundido con el Cursor a continuación, se muestra la ineteger los valores de la matriz de posición tal como para la fila 0 1,1 para la fila 2,etc..
    • Acaba de lanzar el objeto devuelto por getItemAtPosition para el tipo de Cursor (ver arriba), ya que es el tipo de Objeto que está pasando como argumento para su ListView del conjunto de datos
    • Extraño, el método getString() debe tirar de la Cadena de valor en la base de datos asociada con el entero devuelto por getColumnIndex()
    • : ( : (¿qué debo hacer ahora??? necesita ayuda
    • Nvmd, usted todavía no puede. Ok, en primer lugar, creo que usted necesita para pasar el ListView un ArrayList de algún objeto, en lugar del Cursor, ya que no es una matriz de elementos. Cuando usted llame a su base de datos y obtener el Cursor, el bucle a través de todas las entradas y rellenar un Objeto con sus valores, a continuación, añadir a su ArrayList, que luego pasará a la ListView. Entonces usted será capaz de simplemente llamar a las variables directamente desde el Objeto en la posición, y no tiene que preocuparse por el Cursor, excepto cuando la extracción de los datos. También asegúrese de que los valores en la bd son lo que usted piensa
    • a mí una cosa.Si quiero pasar el identificador de fila de la página de la actividad y en otra página me atrapa el id de fila y de forma que la identificación quiero obtener todos los datos de esa fila, ¿qué tengo que hacer?? alguna sugerencia???
    • Tendrías que comparar que el id de fila en la posición del conjunto de datos. Es decir. Si la posición es 3, usted tendría que obtener datos[position]

  2. 0

    Esta excepción se produjo debido a que usted está pasando valor entero para el brindis de masaje.Brindis necesidad char secuencia.Así replate su línea de

        Toast.makeText(ListviewActivity.this,position, Toast.LENGTH_SHORT).show();

    con

      Toast.makeText(ListviewActivity.this,position+"", Toast.LENGTH_SHORT).show();

    clic de listView.

    • Muchas gracias por tu ayuda…pero el mismo problema persiste 🙁
    • pero sgould no vienen después de la sustitución de esta línea como he comprobado en mi final
    • pero en mi aplicación se está dando el mismo error como antes 🙁 🙁
    • he hecho algún error en esta línea » de la Cadena de val=(String)(mListView.getItemAtPosition(posición)); ‘

Dejar respuesta

Please enter your comment!
Please enter your name here