Comment gérer L'événement de clic dans Listview sous android?
ci-dessous est mon code de test pour créer la vue liste, la vue Liste afficher avec succès, cependant, il ya erreur dans l'événement de clic. Je voudrais créer une intention d'envoyer un message hardcode à une nouvelle activité. Cependant, il afficher le message d'erreur pour la ligne
Intent intent = new Intent(context, SendMessage.class);
alors, le problème est, que dois-je prévoir pour cette classe?
aussi, au lieu de coder le message de sortie, comment capturer les données dans la ligne de vue de liste et passer à la nouvelle activité? par exemple,BBB,AAA,R.drawable.tab1_hdpi
pour la première ligne.
Merci.
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);
}
});
}
6 réponses
je ne vois pas où vous déclarez context
. Pour les besoins de la création d'intention, Vous pouvez utiliser 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);
}
});
Pour récupérer l'objet sur vous avez cliqué, vous pouvez utiliser le AdapterView
:
ListEntry entry = (ListEntry) parent.getItemAtPosition(position);
ListView a l'Item click listener callback. Vous devez définir l' onItemClickListener
dans le ListView
. Rappel contient AdapterView
et position
en tant que paramètre. Qui peut vous donner l' 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);
}
});
Erreur est à venir dans votre code à partir de cette déclaration que vous avez dit
Intent intent = new Intent(context, SendMessage.class);
Ceci est dû au fait que vous avez fourni le contexte de la classe onitemclicklistener anonyme dans le constructeur de L'intention mais selon le constructeur de L'intention
android.content.Intent.Intent(Context packageContext, Class<?> cls)
vous devez fournir le contexte de votre activité dans laquelle vous utilisez l'intention qui est le contexte de la classe D'activité principale. si votre déclaration qui donne l'erreur sera convertie
Intent intent = new Intent(MainActivity.this, SendMessage.class);
également pour l'envoi de votre message de ce MainActivity SendMessage classe, veuillez voir ci-dessous le code
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);
}
});
s'il vous Plaît laissez-moi savoir si cela vous aide
EDIT: - Si vous trouvez un problème pour obtenir la valeur de list faites une chose declear votre liste de tableau
ArrayList<ListEntry> members = new ArrayList<ListEntry>();
globalement, c'est-à-dire avant de créer et de changer votre auditeur comme ci-dessous
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);
}
});
ainsi votre code entier aura l'air de
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);
}
});
}
où getMessage () sera une méthode getter spécifié dans votre classe ListEntry que vous utilisez pour obtenir le message qui a été précédemment défini.
tout d'abord, la classe doit implémenter le click listener :
implements OnItemClickListener
puis définissez un listener à la ListView
yourList.setOnItemclickListener(this);
Et enfin, créez le clic de la méthode:
@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
d'Après mon test,
met en œuvre OnItemClickListener - > travaux.
setOnItemClickListener - > works.
ListView est cliquable par défaut (API 19)
l'important est que "cliquer" ne fonctionne qu'avec TextView (si vous choisissez simple_list_item_1.xml de la rubrique). Cela signifie que si vous fournissez des données texte pour le ListView, "cliquez" fonctionne lorsque vous cliquez sur zone de texte. Cliquez sur la zone vide ne déclenche pas ", cliquez sur l'événement".