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);
            }
        });
    }
39
demandé sur Bishan 2013-07-25 11:30:01

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);
86
répondu Blackbelt 2013-07-25 07:30:49

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);
            }
        });
13
répondu Kapil Vats 2015-10-24 19:05:12

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.

6
répondu Abhinav Singh Maurya 2013-07-25 08:18:28

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();
}
6
répondu Avinash Garg 2014-12-03 10:03:53
    //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
répondu Rijul Sudhir 2016-04-28 08:57:59

d'Après mon test,

  1. met en œuvre OnItemClickListener - > travaux.

  2. setOnItemClickListener - > works.

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

2
répondu Chaohsiung Huang 2016-08-29 02:01:40