Как обрабатывать щелчок ListView в Android

Как прослушать событие click в ListView?

Это то, что у меня есть сейчас

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

Когда я делаю следующее

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

   public void onNothingSelected(AdapterView parentView) {  

   }  
});  

Похоже, это ничего не делает при клике.
И весь этот код живет в классе, который расширяет Activity.


person teepusink    schedule 18.03.2010    source источник


Ответы (9)


В представлении списка используйте setOnItemClickListener

person David Hedlund    schedule 18.03.2010
comment
Как вы затем отправляете данные в это подробное представление? (Как YouTube, переходящий к видео) - person Sauron; 04.02.2014
comment
Во-первых, класс должен реализовать прослушиватель кликов: реализует OnItemClickListener Затем установите прослушиватель в ListView yourList.setOnItemclickListener(this); И, наконец, создайте метод 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(); } - person bourax webmaster; 05.04.2014

Предположим, что объект ListView - lv, сделайте следующее:

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
    */  
  }
});
person Aditya Mehta    schedule 22.12.2010
comment
lv недоступен внутри onItemClick. Какой хороший способ обойти это? - person shinjin; 08.04.2014
comment
@shinjin Сделайте это окончательно. final ListView lv = (ListView) findViewById(R.id.your_list_view); - person Lekensteyn; 05.06.2014
comment
Чистый путь: Object o = ((ListView)arg0).getItemAtPosition(position); - person JimmyB; 24.10.2015
comment
Вот ссылка на документацию: developer.android.com/reference/ андроид/виджет/ - person trinity420; 08.04.2017

Вам нужно установить завышенное представление «Clickable» и «возможность прослушивать события кликов» в методе getView() вашего класса адаптера.

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

и объявите прослушиватель кликов в своей ListActivity следующим образом:

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

Это справедливо только в том случае, если вы настраиваете адаптер, расширяя BaseAdapter.

Дополнительные сведения см. в ANDROID_SDK/samples/ApiDemos/src/com/example/android/apis/view/List14.java.

person Vijay C    schedule 18.03.2010
comment
Но это не определяет, какой элемент нажимается, что делает его более или менее бесполезным для списка? Правильный? - person farm ostrich; 21.05.2011
comment
вы можете установить тег для convertView и проверить то же самое в onClick.. с помощью тега можно определить, какой элемент щелкнут... - person Vijay C; 02.09.2011
comment
Я нашел более элегантное решение, чем тег в вашем адаптере, хранящий ссылку setOnClickListener и вызывающий ее в методе onClick(View v). тогда активность может получить событие с позицией. - person jocelyn; 29.12.2012
comment
Ваш метод onClick неверен. Это должно быть onItemClick (AdapterView‹?› родитель, представление View, позиция int, длинный идентификатор) - person IgorGanapolsky; 22.10.2013
comment
@IgorGanapolsky Это не так ..!! это был еще один способ обработки события клика. хотя сейчас это не рекомендуется. [Документация Android] (developer.android.com/reference/android/view /). И то, что вы говорите, уже есть в ответе Адитьи Мехты. - person Vijay C; 22.10.2013

Два ответа перед моим верны - вы можете использовать OnItemClickListener.

Приятно отметить, что разница между OnItemClickListener и OnItemSelectedListener, хотя и звучит тонко, на самом деле значительна, поскольку выбор элементов и фокусировка связаны с сенсорным режимом вашего AdapterView.

По умолчанию в сенсорном режиме нет выделения и фокусировки. Дополнительную информацию по этому вопросу можно найти здесь.

person Dimitar Dimitrov    schedule 18.03.2010

Это решение действительно минималистично и не испортит ваш код.

В вашем list_item.xml (НЕ listView!) назначьте атрибут android:onClick следующим образом:

<RelativeLayout android:onClick="onClickDoSomething">

а затем в своей деятельности вызовите этот метод:

public void onClickDoSomething(View view) {
   // the view is the line you have clicked on
}
person Amio.io    schedule 02.08.2014
comment
хорошее решение, но нет способа получить позицию нажатого элемента - person Bilal Şimşek; 16.02.2020
comment
@BilalŞimşek Долгое время у меня не было Android, но если у view могут быть какие-то метаданные, это может быть способ получить позицию. - person Amio.io; 26.02.2020

Вы должны использовать setOnItemClickListener кто-то сказал.
Код должен быть таким:

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();
    }
});
person Shudy    schedule 23.05.2013

Во-первых, класс должен реализовать прослушиватель кликов:

implements OnItemClickListener

Затем установите прослушиватель в ListView

yourList.setOnItemclickListener(this);

И, наконец, создайте метод 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();
}

вы можете посмотреть и скачать код здесь

person bourax webmaster    schedule 05.04.2014

Используйте API setOnItemClickListener() в своей деятельности. Ниже приведен образец.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

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

});
person Amey Haldankar    schedule 20.01.2015

В Kotlin добавьте слушателя в свой listView так же просто, как java

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

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

 }
person Allen    schedule 12.04.2019