Ci-dessous se trouve mon code de test pour créer la vue liste, la vue liste s’affiche correctement, cependant, il ya une erreur dans l’événement click. Je voudrais créer une intention d'envoyer un message hardcode à une nouvelle activité. Cependant, il affiche une erreur pour la ligne
Intent intent = new Intent(context, SendMessage.class);
Donc, le problème est, que devrais-je prévoir pour cette classe?
En outre, au lieu de coder en dur le message de sortie, comment capturer les données dans la ligne de la vue liste et les transmettre à la nouvelle activité? par exemple. BBB,AAA,R.drawable.tab1_hdpi
pour la première rangée.
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);
}
});
}
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 une fois que vous avez cliqué, vous pouvez utiliser le AdapterView
:
ListEntry entry = (ListEntry) parent.getItemAtPosition(position);
ListView a le rappel d'élément de clic d'élément. Vous devez définir le onItemClickListener
dans le ListView
. Le rappel contient AdapterView
et position
en tant que paramètre. Ce qui peut vous donner le 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);
}
});
Tout d'abord, la classe doit implémenter l'écouteur de clic:
implements OnItemClickListener
Puis définissez un écouteur sur ListView
yourList.setOnItemclickListener(this);
Et enfin, créez la méthode clic:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, "You Clicked at ",
Toast.LENGTH_SHORT).show();
}
Une erreur vient dans votre code à partir de cette déclaration, comme vous l'avez dit
Intent intent = new Intent(context, SendMessage.class);
Cela est dû au fait que vous fournissez le contexte de la classe anonyme OnItemClickListener dans le constructeur Intent, mais en fonction du constructeur de Intent.
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 MainActivity. de sorte que votre déclaration qui donne une erreur sera convertie en
Intent intent = new Intent(MainActivity.this, SendMessage.class);
Pour l'envoi de votre message depuis cette classe MainActivity à SendMessage, veuillez consulter le code ci-dessous.
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, faites-moi savoir si ceci vous aide
EDIT: - Si vous trouvez un problème pour obtenir la valeur de liste, effacez votre liste de tableaux
ArrayList<ListEntry> members = new ArrayList<ListEntry>();
globalement, c’est-à-dire avant de créer et de modifier votre auditeur comme indiqué 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);
}
});
Donc tout votre code va ressembler à
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 de lecture spécifiée dans la classe ListEntry que vous utilisez pour obtenir le message précédemment défini.
//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
Selon mon test,
implémente OnItemClickListener -> travaux.
setOnItemClickListener -> fonctionne.
ListView est cliquable par défaut (API 19)
L'important est que "cliquer" ne fonctionne que pour TextView (si vous choisissez simple_list_item_1.xml comme élément). Cela signifie que si vous fournissez des données texte pour ListView, "cliquez sur" fonctionne lorsque vous cliquez sur une zone de texte. Cliquez sur une zone vide ne déclenche pas "événement clic".