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,
implementa OnItemClickListener -> funciona.
setOnItemClickListener -> funciona.
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