web-dev-qa-db-fra.com

Comment gérer l'événement click dans Listview dans Android?

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);
            }
        });
    }
42
user782104

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

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);
            }
        });
13
Kapil Vats

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();
}
6
Avinash Garg

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.

6
    //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
2
Rijul Sudhir

Selon mon test,

  1. implémente OnItemClickListener -> travaux.

  2. setOnItemClickListener -> fonctionne.

  3. 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".

2
Chaohsiung Huang