Jak obsługiwać kliknięcie ListView w systemie Android

141

Jak słuchać zdarzenia kliknięcia w widoku ListView?

Oto, co mam teraz

ListView list = (ListView)findViewById(R.id.ListView01);  
...  
list.setAdapter(adapter);  

Kiedy wykonam następujące czynności

list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {  
   public void onItemSelected(AdapterView parentView, View childView, 
                                                         int position, long id) 
   {  
       setDetail(position);  
   }

   public void onNothingSelected(AdapterView parentView) {  

   }  
});  

To nie wydaje się działać po kliknięciu.
Cały ten kod znajduje się w klasie rozszerzającej Activity.

teepusink
źródło

Odpowiedzi:

182

W widoku listy użyj setOnItemClickListener

David Hedlund
źródło
Dzięki David. Geezzz, próbowałem setOnClickListener i setOnItemSelectedListener, ale przegapiłem czytanie setOnItemClickListener. Dzięki, Tee
teepusink
zrobiłem to samo co teepusink: D
Shereef Marzouk
Jak następnie wysyłasz dane do tego szczegółowego widoku? (Jak w YouTube, przechodząc do filmu)
Sauron,
Po pierwsze, klasa musi implementować detektor kliknięć: implementuje OnItemClickListener Następnie należy ustawić detektor na ListView yourList.setOnItemclickListener (this); Na koniec utwórz metodę klasyczną: @Override public void onItemClick (AdapterView <?> Parent, View view, int position, long id) {Toast.makeText (MainActivity.this, "You Clicked at" + countries [+ position], Toast.LENGTH_SHORT) .show (); }
webmaster bourax
88

Załóżmy, że obiektem ListView jest lv, wykonaj następujące czynności:

lv.setClickable(true);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

  @Override
  public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

    Object o = lv.getItemAtPosition(position);
    /* write you handling code like...
    String st = "sdcard/";
    File f = new File(st+o.toString());
    // do whatever u want to do with 'f' File object
    */  
  }
});
Aditya Mehta
źródło
1
lvnie jest dostępny w środku onItemClick. Jaki jest fajny sposób na obejście tego?
shinjin
1
@shinjin Zrób to ostateczne. final ListView lv = (ListView) findViewById(R.id.your_list_view);
Lekensteyn
Czysty sposób:Object o = ((ListView)arg0).getItemAtPosition(position);
JimmyB
Oto link do dokumentacji: developer.android.com/reference/android/widget/ ...
trinity420
42

W metodzie getView () klasy adaptera należy ustawić widok zawyżony „Klikalny” i „Możliwość nasłuchiwania zdarzeń kliknięcia”.

convertView = mInflater.inflate(R.layout.list_item_text, null);
convertView.setClickable(true);
convertView.setOnClickListener(myClickListener);

i zadeklaruj odbiornik kliknięć w ListActivity w następujący sposób,

public OnClickListener myClickListener = new OnClickListener() {
public void onClick(View v) {
                 //code to be written to handle the click event
    }
};

Dotyczy to tylko sytuacji, gdy dostosowujesz adapter przez rozszerzenie BaseAdapter.

Więcej informacji można znaleźć w ANDROID_SDK / samples / ApiDemos / src / com / example / android / apis / view / List14.java

Vijay C
źródło
dzięki Vijay mam problem z kliknięciem w widoku inflacji, który rozwiązałem z Twojej odpowiedzi
dhaiwat
Ale to nie określa, który element jest klikany, co czyni go mniej lub bardziej bezużytecznym dla listy? Poprawny?
ferma strusia
możesz ustawić tag na convertView i sprawdzić to samo w onClick .. używając tagu, który element został kliknięty, można zidentyfikować ...
Vijay C
Znalazłem bardziej eleganckie rozwiązanie niż tag w twoim adapterze, przechowuj referencję setOnClickListener i wywołuj ją metodą onClick (View v). wtedy działalność może odebrać zdarzenie ze stanowiskiem.
jocelyn
Twoja metoda onClick jest nieprawidłowa. Powinien być onItemClick (AdapterView <?> Nadrzędny, widok widoku, pozycja int, długi id)
IgorGanapolsky
17

Dwie odpowiedzi przed moją są poprawne - możesz użyć OnItemClickListener.

Warto zauważyć, że różnica między OnItemClickListeneri OnItemSelectedListener, choć brzmi subtelnie, jest w rzeczywistości znacząca, ponieważ wybór przedmiotu i skupienie się są związane z trybem dotykowym twojego AdapterView.

Domyślnie w trybie dotykowym nie ma wyboru ani ostrości. Więcej informacji na ten temat można znaleźć tutaj .

Dimitar Dimitrov
źródło
8

To rozwiązanie jest naprawdę minimalistyczne i nie psuje kodu.

W swoim list_item.xml (NIE listView!) Przypisz atrybut android: onClick w ten sposób:

<RelativeLayout android:onClick="onClickDoSomething">

a następnie w swoim działaniu wywołaj tę metodę:

public void onClickDoSomething(View view) {
   // the view is the line you have clicked on
}
Amio.io
źródło
dobre rozwiązanie, ale nie ma sposobu, aby uzyskać pozycję klikniętej pozycji
Bilal Şimşek
@ BilalŞimşek Przez długi czas nie korzystałem z Androida, ale jeśli viewmoże mieć jakieś metadane, może to być sposób, jak uzyskać pozycję.
Amio.io
6

Musisz użyć setOnItemClickListenerkogoś, kto powiedział.
Kod powinien wyglądać następująco:

listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // When clicked, show a toast with the TextView text or do whatever you need.
        Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
    }
});
Shudy
źródło
5

Po pierwsze, klasa musi implementować detektor kliknięć:

implements OnItemClickListener

Następnie ustaw odbiornik na ListView

yourList.setOnItemclickListener(this);

Na koniec utwórz metodę clic:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, "You Clicked at " +countries[+ position], Toast.LENGTH_SHORT).show();
}

możesz spojrzeć i pobrać kod tutaj

webmaster bourax
źródło
3

Użyj interfejsu API setOnItemClickListener () w swoim działaniu. Poniżej znajduje się próbka.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

@Override
public void onItemClick(AdapterView<> parent, View view, int position, long id)
{
     // your code here.
}

});
Amey Haldankar
źródło
1

W Kotlinie dodaj odbiornik do swojego listView tak prostego jak java

your_listview.setOnItemClickListener { parent, view, position, id ->   

    Toast.makeText(this, position, Toast.LENGTH_SHORT).show()

 }
Allen
źródło