Як поводитися з клацанням 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


Дякую, Девід. Geezzz, я спробував setOnClickListener та setOnItemSelectedListener, але пропустив читання setOnItemClickListener. Дякую,
Трійко

Я зробив те ж саме, що і теппісінк: D
Шериф Марзук

Як потім ви надсилаєте дані до цього детального перегляду? (Як і YouTube, натиснувши на відео)
Саурон,

По-перше, клас повинен реалізувати слухач кліків: реалізує OnItemClickListener, а потім встановити слухача ListView yourList.setOnItemclickListener (це); І нарешті, створіть метод кліку: @Override public void onItemClick (AdapterView <?> Батьків, Перегляд подання, позиція int, довгий ідентифікатор) {Toast.makeText (MainActivity.this, "Ви натиснули на" + країни [+ позиція], Тост.LENGTH_SHORT) .show (); }
веб-майстер bourax

88

Припустимо, об’єкт 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

1
@shinjin Зробіть його остаточним. final ListView lv = (ListView) findViewById(R.id.your_list_view);
Лекенштейн

Чистий шлях:Object o = ((ListView)arg0).getItemAtPosition(position);
JimmyB

Ось посилання на документацію: developer.android.com/reference/android/widget/…
trinity420

42

Потрібно встановити завищений вигляд "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 / sample / ApiDemos / src / com / example / android / apis / view / List14.java


спасибі Vijay, я зіткнувся з проблемою клацання на надутому перегляді, який я
вирішу

Але це не визначає, на який елемент натискають, що робить його більш-менш марним для списку? Правильно?
хутір страус

ви можете встановити тег для переглядуView та перевірити те саме в onClick .. за допомогою тегу, на який елемент натиснуто, можна визначити ...
Vijay C

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

Ваш метод onClick невірний. Це має бути onItemClick (AdapterView <?> Батьків, перегляд подання, позиція int, довгий ідентифікатор)
IgorGanapolsky

17

Дві відповіді перед моєю є правильними - ви можете використовувати OnItemClickListener .

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

За замовчуванням у сенсорному режимі немає вибору та фокусування. Ви можете подивитися тут, щоб отримати додаткову інформацію по цій темі.


8

Це рішення дійсно мінімалістичне і не псує ваш код.

У своєму list_item.xml (НЕ listView!) Призначте атрибут android: onНатисніть так:

<RelativeLayout android:onClick="onClickDoSomething">

а потім у своїй діяльності називайте цей метод:

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

гарне рішення, але, немає можливості отримати позицію, на яку натиснули товар
Bilal Şimşek

@ 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);

І нарешті, створіть метод кліку:

@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

Використовуйте api setOnItemClickListener () у своїй діяльності. Далі йде зразок.

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

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

});

1

У Котліні додайте слухача до свого спискуView так просто, як 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.