วิธีจัดการ 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) {  

   }  
});  

ดูเหมือนจะไม่ทำอะไรเลยเมื่อคลิก
และรหัสทั้งหมดนั้นจะอยู่ในชั้นเรียนที่ขยายกิจกรรม

คำตอบ:


182

ในมุมมองรายการของคุณใช้ setOnItemClickListener


ขอบคุณเดวิด Geezzz ฉันพยายาม setOnClickListener และ setOnItemSelectedListener แต่พลาดการอ่าน setOnItemClickListener ขอบคุณ Tee
teepusink

ฉันทำเช่นเดียวกับ teepusink: D
Shereef Marzouk

คุณจะส่งข้อมูลไปยังมุมมองรายละเอียดได้อย่างไร (เช่น youtube คลิกผ่านไปยังวิดีโอ)
Sauron

ก่อนอื่นคลาสจะต้องดำเนินการฟังคลิก: ดำเนิน OnItemClickListener จากนั้นตั้งค่าฟังเป็น ListView yourList.setOnItemclickListener (นี้); และสุดท้ายสร้างวิธี clic: @Override โมฆะสาธารณะ onItemClick (AdapterView <?> พาเรนต์มุมมองมุมมองตำแหน่ง int id ยาว) {Toast.makeText (MainActivity.this "คุณคลิกที่" + ประเทศ [+ ตำแหน่ง], Toast.LENGTH_SHORT) .show (); }
bourax webmaster

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
lvonItemClickคือไม่ได้อยู่ในที่สามารถเข้าถึงได้ เป็นวิธีที่ดีในการรับรอบที่อะไร
ชินจิน

1
@ ชินจินทำให้มันจบ 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

42

คุณต้องตั้งค่ามุมมองที่สูงเกินจริง "คลิกได้" และ "สามารถฟังเหตุการณ์การคลิก" ในเมธอดคลาส 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 สำหรับรายละเอียดเพิ่มเติม


ขอบคุณวีเจย์ฉันได้หันหน้าไปทางปัญหาคลิกที่มุมมองพองฉันต้องแก้จากคำตอบของคุณ
dhaiwat

แต่นี่ไม่ได้กำหนดว่าจะคลิกไอเท็มใดซึ่งทำให้ไร้ประโยชน์มากขึ้นสำหรับรายการ แก้ไข?
ฟาร์มนกกระจอกเทศ

คุณสามารถตั้งค่าแท็กเป็น convertView และตรวจสอบสิ่งเดียวกันใน onClick .. โดยใช้แท็กที่สามารถระบุรายการที่สามารถคลิกได้ ...
Vijay C

ฉันได้พบโซลูชันที่สวยงามกว่าแท็กในอะแดปเตอร์ของคุณเก็บการอ้างอิง setOnClickListener และเรียกมันบนเมธอด onClick (View v) จากนั้นกิจกรรมสามารถรับเหตุการณ์ด้วยตำแหน่ง
โจเซลีน

วิธีการ onClick ของคุณผิด ควรเป็น onItemClick (AdapterView <?> พาเรนต์, มุมมอง, ตำแหน่งภายใน, id ยาว)
IgorGanapolsky

17

ทั้งสองคำตอบก่อนที่เหมืองที่ถูกต้อง - OnItemClickListenerคุณสามารถใช้

มันเป็นเรื่องที่ดีที่จะทราบว่าความแตกต่างระหว่างOnItemClickListenerและในขณะที่ทำให้เกิดเสียงที่ลึกซึ้งในความเป็นจริงอย่างมีนัยสำคัญเช่นการเลือกรายการและมุ่งเน้นที่เกี่ยวข้องกับโหมดการสัมผัสของคุณOnItemSelectedListenerAdapterView

ตามค่าเริ่มต้นในโหมดสัมผัสจะไม่มีการเลือกและโฟกัส คุณสามารถดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่อง


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

@ 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 เพิ่ม listener ให้ listView ของคุณง่ายเหมือน java

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

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

 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.