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

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 members = new ArrayList(); 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); } }); } 

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); 

ListView tiene la callback del oyente de clic de elemento. Debe establecer onItemClickListener en ListView . La callback 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); } }); 

El error está viniendo en su código de esta statement 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 statement 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 members = new ArrayList(); 

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 members = new ArrayList(); @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.

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 

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”.