studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android listview android-intent onitemclicklistener onitemclick

programacion - ¿Cómo manejar el evento click en Listview en android?



manual de programacion android pdf (6)

El siguiente es mi código de prueba para crear la vista de lista, la vista de lista se visualiza con éxito, sin embargo, hay un error en el evento de clic. Me gustaría crear una intención para enviar un mensaje de código duro a una nueva actividad. Sin embargo, muestra un error en la línea

Intent intent = new Intent(context, SendMessage.class);

Entonces, el problema es, ¿qué debería proporcionar para esta clase?

Además, en lugar de codificar el mensaje de salida, ¿cómo capturar los datos en la fila de vista de lista y pasar a la nueva actividad? por ejemplo BBB,AAA,R.drawable.tab1_hdpi para la primera fila.

Gracias.

public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<ListEntry> members = new ArrayList<ListEntry>(); members.add(new ListEntry("BBB","AAA",R.drawable.tab1_hdpi)); members.add(new ListEntry("ccc","ddd",R.drawable.tab2_hdpi)); members.add(new ListEntry("assa","cxv",R.drawable.tab3_hdpi)); members.add(new ListEntry("BcxsadvBB","AcxdxvAA")); members.add(new ListEntry("BcxvadsBB","AcxzvAA")); members.add(new ListEntry("BcxvBB","AcxvAA")); members.add(new ListEntry("BvBB","AcxsvAA")); members.add(new ListEntry("BcxvBB","AcxsvzAA")); members.add(new ListEntry("Bcxadv","AcsxvAA")); members.add(new ListEntry("BcxcxB","AcxsvAA")); ListView lv = (ListView)findViewById(R.id.listView1); Log.i("testTag","before start adapter"); StringArrayAdapter ad = new StringArrayAdapter (members,this); Log.i("testTag","after start adapter"); Log.i("testTag","set adapter"); lv.setAdapter(ad); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(context, SendMessage.class); String message = "abc"; intent.putExtra(EXTRA_MESSAGE, message); startActivity(intent); } }); }


De acuerdo con mi prueba,

  1. implementa OnItemClickListener -> funciona.

  2. setOnItemClickListener -> funciona.

  3. ListView se puede hacer clic de forma predeterminada (API 19)

Lo importante es que "hacer clic" solo funciona con TextView (si elige simple_list_item_1.xml como elemento). Esto significa que si proporciona datos de texto para ListView, "clic" funciona cuando hace clic en el área de texto. Hacer clic en el área vacía no activa el "evento de clic".


El error está viniendo en su código de esta declaración como usted dijo

Intent intent = new Intent(context, SendMessage.class);

Esto se debe a que está proporcionando el contexto de la clase anónima OnItemClickListener en el constructor Intent, pero de acuerdo con el constructor de Intento.

android.content.Intent.Intent(Context packageContext, Class<?> cls)

Debe proporcionar el contexto de su actividad en el que está utilizando la intención que es el contexto de clase de actividad principal. por lo que su declaración que está dando error se convertirá en

Intent intent = new Intent(MainActivity.this, SendMessage.class);

También para enviar su mensaje desde esta actividad principal a la clase SendMessage vea el código a continuación

lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListEntry entry= (ListEntry) parent.getAdapter().getItem(position); Intent intent = new Intent(MainActivity.this, SendMessage.class); intent.putExtra(EXTRA_MESSAGE, entry.getMessage()); startActivity(intent); } });

Por favor, hágamelo saber si esto le ayuda

EDITAR: - Si encuentra algún problema para obtener el valor de la lista, haga algo para decidir su lista de arreglos.

ArrayList<ListEntry> members = new ArrayList<ListEntry>();

globalmente, es decir, antes de crear y cambiar tu oyente como se muestra a continuación

lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(MainActivity.this, SendMessage.class); intent.putExtra(EXTRA_MESSAGE, members.get(position)); startActivity(intent); } });

Entonces, todo su código se verá como

public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE"; ArrayList<ListEntry> members = new ArrayList<ListEntry>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); members.add(new ListEntry("BBB","AAA",R.drawable.tab1_hdpi)); members.add(new ListEntry("ccc","ddd",R.drawable.tab2_hdpi)); members.add(new ListEntry("assa","cxv",R.drawable.tab3_hdpi)); members.add(new ListEntry("BcxsadvBB","AcxdxvAA")); members.add(new ListEntry("BcxvadsBB","AcxzvAA")); members.add(new ListEntry("BcxvBB","AcxvAA")); members.add(new ListEntry("BvBB","AcxsvAA")); members.add(new ListEntry("BcxvBB","AcxsvzAA")); members.add(new ListEntry("Bcxadv","AcsxvAA")); members.add(new ListEntry("BcxcxB","AcxsvAA")); ListView lv = (ListView)findViewById(R.id.listView1); Log.i("testTag","before start adapter"); StringArrayAdapter ad = new StringArrayAdapter (members,this); Log.i("testTag","after start adapter"); Log.i("testTag","set adapter"); lv.setAdapter(ad); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(MainActivity.this, SendMessage.class); intent.putExtra(EXTRA_MESSAGE, members.get(position).getMessage()); startActivity(intent); } }); }

Donde getMessage () será un método getter especificado en su clase ListEntry que está utilizando para obtener el mensaje que se estableció previamente.


ListView tiene la devolución de llamada del oyente de clic de elemento. Debe establecer onItemClickListener en ListView . La devolución de llamada contiene AdapterView y position como parámetro. Que puede darte el ListEntry .

lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ListEntry entry= (ListEntry) parent.getAdapter().getItem(position); Intent intent = new Intent(MainActivity.this, SendMessage.class); String message = entry.getMessage(); intent.putExtra(EXTRA_MESSAGE, message); startActivity(intent); } });


No puedo ver dónde declaras el context . Para el propósito de la creación de intención puede usar MainActivity.this

lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(MainActivity.this, SendMessage.class); String message = "abc"; intent.putExtra(EXTRA_MESSAGE, message); startActivity(intent); } });

Para recuperar el objeto sobre el que ha hecho clic, puede usar AdapterView :

ListEntry entry = (ListEntry) parent.getItemAtPosition(position);


Primero, la clase debe implementar el click listener:

implements OnItemClickListener

Luego configure un oyente en ListView

yourList.setOnItemclickListener(this);

Y finalmente, crea el método clic:

@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "You Clicked at ", Toast.LENGTH_SHORT).show(); }


//get main activity final Activity main_activity=getActivity(); //list view click listener final ListView listView = (ListView) inflatedView.findViewById(R.id.listView_id); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String stringText; //in normal case stringText= ((TextView)view).getText().toString(); //in case if listview has separate item layout TextView textview=(TextView)view.findViewById(R.id.textview_id_of_listview_Item); stringText=textview.getText().toString(); //show selected Toast.makeText(main_activity, stringText, Toast.LENGTH_LONG).show(); } }); //populate listview