วิธีการใช้ฟังคลิกยาวบน listview


148

ฉันต้องการเพิ่มOnLongClickListenerในมุมมองรายการของฉัน เมื่อใดก็ตามที่ผู้ใช้กดรายการในรายการนาน ๆ ควรดำเนินการบางอย่าง แต่รหัสของฉันไม่ได้จับผู้ฟังนี้ โปรดแจ้งให้ฉันทราบว่าฉันกำลังไปผิดที่ รหัสที่คล้ายกันใช้งานได้setOnItemClickListenerดีมาก

นี่คือรหัส:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {
                // TODO Auto-generated method stub
                 Log.d("in onLongClick");
                 String str=listView.getItemAtPosition(index).toString();

                 Log.d("long click : " +str);
                return true;
            }
}); 

คุณจำได้ว่าจะเพิ่ม "ดำเนินการ OnItemLongClickListener" เพื่อประกาศคลาสของคุณ?
แบร์รี่

เห็นใน xml ว่าเปิดใช้งานนานแค่ไหน?
เชื่อมต่อชีวิตกับ Android

บางทีคุณอาจมี Gesture Listener หรืออะไรทำนองนี้ที่เก็บกดแบบยาวและกินมัน
Jon Zangitu

คำตอบ:


317

คุณต้องตั้งค่าsetOnItemLongClickListener ()ใน ListView:

lv.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int pos, long id) {
                // TODO Auto-generated method stub

                Log.v("long clicked","pos: " + pos);

                return true;
            }
        }); 

XML สำหรับแต่ละรายการในรายการ (คุณควรใช้ XML ที่กำหนดเอง) ต้องมีandroid:longClickable="true"เช่นกัน (หรือคุณสามารถใช้วิธีการอำนวยความสะดวกlv.setLongClickable(true);) วิธีนี้คุณสามารถมีรายการที่มีเพียงบางรายการที่ตอบสนองต่อ longclick

หวังว่านี่จะช่วยคุณได้


25
ให้แน่ใจว่าได้โทรlv.setLongClickable(true);ด้วย
Chris Lacy

15
สิ่งนี้ไม่ได้ผลสำหรับฉัน แต่สิ่งนี้จะ:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Luis A. Florit

อย่างใด adroid: longClickable = "true" เป็นค่าเริ่มต้น ฉันใช้ API 19 ดังนั้นฉันไม่จำเป็นต้องระบุเลย
user1592714

2
Android ตั้งค่า longClickable = true เมื่อตั้งค่าฟัง
Steven Spungin

ค่าใดที่ถูกเก็บไว้ใน id ยาว ในบูลีนสาธารณะ onItemLongClick (AdapterView <?> arg0, ดู arg1, int pos, id ยาว
Femn Dharamshi

26

หากรายการแถว ListView ของคุณอ้างถึงไฟล์ XML แยกต่างหากอย่าลืมเพิ่มandroid:longClickable="true"ไปยังไฟล์เลย์เอาต์นั้นนอกเหนือจากการตั้งค่าsetOnItemLongClickListener()เป็น ListView ของคุณ


ขอบคุณ! ตีหัวฉันด้วยอันนี้
Shaihi

15

หรือลองใช้รหัสนี้:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {

    Toast.makeText(list.this,myList.getItemAtPosition(index).toString(), Toast.LENGTH_LONG).show();
                return false;
            }
}); 

6

ฉันคิดว่ารหัสข้างต้นนี้จะทำงานใน LongClicking มุมมองไม่ใช่รายการแต่ละรายการ

registerForContextMenu(listView)ทำไมไม่ใช้ และรับการเรียกกลับใน OnCreateContextMenu

สำหรับกรณีการใช้งานส่วนใหญ่มันจะทำงานเหมือนกัน


2

ในการเพิ่ม xml

<ListView android:longClickable="true">

ในไฟล์ java

lv.setLongClickable(true) 

ลอง setOnItemLongClickListener นี้ ()

lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int pos, long l) {
                //final String category = "Position at : "+pos;
                final String category = ((TextView) view.findViewById(R.id.textView)).getText().toString();
                Toast.makeText(getActivity(),""+category,Toast.LENGTH_LONG).show();
                args = new Bundle();
                args.putString("category", category);
                return false;
            }
        });

1

สิ่งนี้น่าจะใช้ได้

ListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                           int pos, long id) {
                // TODO Auto-generated method stub

                Toast.makeText(getContext(), "long clicked, "+"pos: " + pos, Toast.LENGTH_LONG).show();

                return true;
            }
        });

อย่าลืมใน xml ของคุณ android:longClickable="true"หรือถ้าคุณมีมุมมองที่กำหนดเองให้เพิ่มสิ่งนี้ในคลาสมุมมองที่คุณกำหนดเองyouCustomView.setLongClickable(true);

นี่คือผลลัพธ์ของโค้ดด้านบน ป้อนคำอธิบายรูปภาพที่นี่


1

ฉันลองคำตอบเหล่านี้ส่วนใหญ่และพวกเขาทั้งหมดล้มเหลวสำหรับ TextViews ที่เปิดใช้งานการเชื่อมโยงอัตโนมัติ แต่ยังต้องใช้การกดแบบยาวในที่เดียวกัน!

ฉันสร้างคลาสที่กำหนดเองที่ใช้งานได้

public class TextViewLinkLongPressUrl extends TextView {

    private boolean isLongClick = false;

    public TextViewLinkLongPressUrl(Context context) {
        super(context);
    }

    public TextViewLinkLongPressUrl(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TextViewLinkLongPressUrl(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text, type);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_UP && isLongClick) {
            isLongClick = false;
            return false;
        }

        if (event.getAction() == MotionEvent.ACTION_UP) {
            isLongClick = false;
        }

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            isLongClick = false;
        }

        return super.onTouchEvent(event);
    }

    @Override
    public boolean performLongClick() {
        isLongClick = true;
        return super.performLongClick();
    }
}

0

สิ่งนี้ทำงานได้สำหรับฉันสำหรับ cardView และจะทำงานเหมือนกันสำหรับ listview ภายใน calss อะแดปเตอร์ภายในonBindViewHolder()ฟังก์ชัน

holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                return false;
            }
        });

0

ถ้าคุณต้องการที่จะทำในอะแดปเตอร์คุณสามารถทำได้:

itemView.setOnLongClickListener(new View.OnLongClickListener()
        {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
            }
        });

0
    listView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        return false;
    }
});

เคล็ดลับไม่แน่นอน

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