Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Obtener clic en el elemento de listview

Tengo un problema. Antes de la modificación en mi archivo XML, mi listview fue capaz de funcionar perfectamente. Pero ahora, después de algunas modificaciones en xml, no funciona correctamente. Mi listview es personalizado. Por lo tanto, he creado XML separado para procesar cada fila en el listview.

Mi código row.xml único:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:id="@+id/relativeLayoutSingleRowManageAddictions" android:layout_height="40dp" android:background="@drawable/box_midbg" > <TextView android:id="@+id/textViewSingleRowManageAddictions" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="17dp" android:text="TextView" android:textSize="20dp" android:textColor="#ffffff" /> <ImageView android:id="@+id/imageViewSingleRowManageAddictions" android:layout_width="20dp" android:layout_height="20dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="18dp" android:src="@drawable/listing_arrow" /> </RelativeLayout> 

Mi código main.xml donde reside listview:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/main_bg_edited" > <RelativeLayout android:id="@+id/relativeLayout1" style="@style/top_bar_style" > <ImageView android:id="@+id/imageViewMAnageAddictionsBack" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:src="@drawable/back_arrow" android:clickable="true" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/header_style" android:text="Manage Addictions" /> <ImageView android:id="@+id/imageViewManageAddictionsAdd" android:layout_width="25dp" android:layout_height="20dp" android:layout_marginRight="3dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:src="@drawable/plus_nav" android:clickable="true" /> </RelativeLayout> <ListView android:id="@+id/listViewManageAddictions" android:layout_width="290dp" android:layout_height="fill_parent" android:layout_below="@+id/relativeLayout1" android:layout_centerHorizontal="true" android:layout_centerInParent="true" android:layout_marginTop="12dp" android:divider="@android:color/transparent" android:dividerHeight="2dp" /> </RelativeLayout> 

Y mi código de Java para él:

 package com.addictioncounterapp; import java.util.ArrayList; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class ManageAddictionList extends Activity { ImageView iv_manage_addictions_back, iv_manage_addictions_add; ListView listview; ArrayList < String > arraylist_manage_addiction; ArrayAdapter < String > arrayadapter_manage_addiction; SQLiteDatabase database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_manage_addiction_list); loaddatabase(); iv_manage_addictions_back = (ImageView) findViewById(R.id.imageViewMAnageAddictionsBack); iv_manage_addictions_back.setClickable(true); iv_manage_addictions_back.setOnClickListener(new OnClickListener() {@Override public void onClick(View v) { startActivity(new Intent(ManageAddictionList.this, Settings.class)); } }); iv_manage_addictions_add = (ImageView) findViewById(R.id.imageViewManageAddictionsAdd); iv_manage_addictions_add.setClickable(true); iv_manage_addictions_add.setOnClickListener(new OnClickListener() {@Override public void onClick(View v) { Intent intent = new Intent(ManageAddictionList.this, MainActivity.class); intent.putExtra("name", ""); intent.putExtra("unit", ""); intent.putExtra("attribute", ""); intent.putExtra("limit", ""); intent.putExtra("operation", "Add Addiction"); startActivity(intent); } }); arraylist_manage_addiction = new ArrayList < String > (); manageList(); listview = (ListView) findViewById(R.id.listViewManageAddictions); if (arraylist_manage_addiction.isEmpty()) Toast.makeText(getBaseContext(), "No Addictions found to manage. Click on 'add' button to create new Addiction.", Toast.LENGTH_SHORT) .show(); else listview.setAdapter(arrayadapter_manage_addiction); listview.setOnItemClickListener(new OnItemClickListener() {@Override public void onItemClick(AdapterView <? > arg0, View arg1, int arg2, long arg3) { String name = null, attribute = null, unit = null, limit = null; View parentView = (View) arg0.getParent(); name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions)) .getText() + ""; Toast.makeText(getBaseContext(), name, Toast.LENGTH_SHORT) .show(); int cat_id = 0; //--------Fetching cat_id through name from the list-------- Cursor cursor; cursor = database.query("category", new String[] { "cat_id" }, new String("cat_name=?"), new String[] { name }, null, null, null); if (cursor.getCount() > 0) { while (cursor.moveToNext()) cat_id = cursor.getInt(0); cursor.close(); } //--------Fetching unit, attribute, limit through cat_id from the list-------- cursor = database.query("category_attribute", new String[] { "cat_attribute_name", "cat_attribute_unit", "cat_limit" }, new String("cat_id=?"), new String[] { cat_id + "" }, null, null, null); if (cursor.getCount() > 0) { while (cursor.moveToNext()) { attribute = cursor.getString(0); unit = cursor.getString(1); limit = cursor.getString(2); } cursor.close(); } Intent intent = new Intent(ManageAddictionList.this, MainActivity.class); intent.putExtra("name", name); intent.putExtra("unit", unit); intent.putExtra("attribute", attribute); intent.putExtra("limit", limit); intent.putExtra("cat_id", cat_id); intent.putExtra("operation", "Edit Addiction"); startActivity(intent); } }); } private void loaddatabase() { database = openOrCreateDatabase("AddictionCounter.db", SQLiteDatabase.OPEN_READONLY, null); } private void manageList() { String[] columns = { "cat_name" }; Cursor cursor; cursor = database.query("category", columns, null, null, null, null, null); if (cursor.getCount() > 0) { while (cursor.moveToNext()) arraylist_manage_addiction.add(cursor.getString(0)); cursor.close(); } arrayadapter_manage_addiction = new ArrayAdapter < String > (this, R.layout.single_row_manage_addictions, R.id.textViewSingleRowManageAddictions, arraylist_manage_addiction); } } 

El error principal detrás de esto es que, cuando consigo el nombre usando esto:

 View parentView = (View) arg0.getParent(); name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions)).getText()+""; 

El listview de cualquier registro, sólo da el nombre del primer registro. Por ejemplo, si mi primera fila tiene textview llamado "Gaming", cuando hago clic en cualquier fila, (para fines de depuración, Toast.makeText(...)) utilizado Toast.makeText(...)) Toasts "Gaming" como el nombre de cada registro en el Listview, aunque cada registro en el listview es único. Por favor, me ayudas con ésto.

  • Android - eliminar el elemento de ListView en un clic largo
  • Vista de lista de Android setOnItemClickListener no funciona
  • Listview error: "Su contenido debe tener un ListView cuyo atributo id es 'android.R.id.list'"
  • Actividad refrescante al recibir la notificación de gcm push
  • Android: mantiene el elemento de ListView resaltado una vez que se ha hecho clic en él.
  • Casillas de verificación en un ListView - Cuando selecciono el primero, comprueba el último y viceversa
  • Ormlite, listViews y adaptadores?
  • Haga clic en ImageView dentro de ListView ListItem y obtenga la posición?
  • 4 Solutions collect form web for “Obtener clic en el elemento de listview”

     lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // selected item String selected = ((TextView) view.findViewById(R.id.your_textView_item_id)).getText().toString(); Toast toast = Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT); toast.show(); } }); 

    Si desea onClickListener en TextView , es mejor definir onClickListener en el propio adaptador. me gusta

     yourTextView.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // showToast() } }); 
     listView = (ListView)view.findViewById(R.id.list); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String selected = ((TextView) view.findViewById(R.id.complaint)).getText().toString(); Toast.makeText(context,selected,Toast.LENGTH_LONG).show(); } }); 

    Aparte de la solución anterior, esto funcionó para mí i se enfrentaba a una situación similar, pude resolverlo después de añadir el siguiente

    android:descendantFocusability="blocksDescendants"

    A mi listview en xml. Está trabajando ahora. Para el usuario curioso real aquí hay más información acerca de http://developer.android.com/reference/android/R.attr.html#descendantFocusability

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.