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


141

Как мне прослушать событие щелчка в 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.

Ответы:


182

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


Спасибо, Дэвид. Боже, я пробовал setOnClickListener и setOnItemSelectedListener, но пропустил чтение setOnItemClickListener. Спасибо, Ти
teepusink

Я сделал то же самое, что и teepusink: D
Шериф Марзук

Как вы затем отправляете данные в это подробное представление? (Как на YouTube, переходящий к видео)
Саурон

Во-первых, класс должен реализовать прослушиватель щелчков: реализует OnItemClickListener. Затем установить прослушиватель для ListView yourList.setOnItemclickListener (this); И, наконец, создайте метод клика: @Override public void onItemClick (AdapterView <?> Parent, View view, int position, long id) {Toast.makeText (MainActivity.this, «Вы нажали на» + страны [+ позиция], Toast.LENGTH_SHORT) .show (); }
bourax webmaster 05

89

Предположим, что объект 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
    */  
  }
});

1
lvне доступен внутри onItemClick. Какой хороший способ обойти это?
shinjin 08

1
@shinjin Сделайте это окончательным. final ListView lv = (ListView) findViewById(R.id.your_list_view);
Lekensteyn

Чистый путь:Object o = ((ListView)arg0).getItemAtPosition(position);
JimmyB

Вот ссылка на документацию: developer.android.com/reference/android/widget/…
trinity420 08

42

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

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 для получения более подробной информации.


спасибо, Виджей, у меня
возникла

Но это не определяет, какой элемент нажимается, что делает его более или менее бесполезным для списка? Верный?
Страусиная ферма

вы можете установить тег для convertView и проверить то же самое в onClick ... с помощью тега, по которому щелкнули элемент, можно определить ...
Виджай С.

Я нашел более элегантное решение, чем тег в вашем адаптере, хранящий ссылку на setOnClickListener и вызываю его в методе onClick (View v). тогда действие может получить событие с позицией.
jocelyn

Ваш метод onClick неверен. Это должно быть onItemClick (родительский адаптерView <?>, Представление представления, позиция int, длинный идентификатор)
Игорь Ганапольский

17

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

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

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


8

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

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

<RelativeLayout android:onClick="onClickDoSomething">

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

public void onClickDoSomething(View view) {
   // the view is the line you have clicked on
}

хорошее решение, но нет способа получить позицию щелчка по элементу
Билал Шимшек

@ BilalŞimşek В течение долгого времени у меня не было Android, но если у viewменя могут быть какие-то метаданные, это может быть способ получить позицию.
Amio.io

6

Вы должны использовать 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();
    }
});

5

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

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

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


3

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

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

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

});

1

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

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

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

 }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.