bagaimana menerapkan pendengar klik panjang pada tampilan daftar

148

Saya ingin menambahkan OnLongClickListenerpada tampilan daftar saya. Setiap kali pengguna menekan item dalam daftar, beberapa tindakan harus dilakukan, tetapi kode saya tidak menangkap pendengar ini. Tolong beri tahu saya di mana saya salah. Kode serupa berfungsi dengan setOnItemClickListenersangat baik.

Ini kodenya:

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;
            }
}); 
techayu
sumber
Apakah Anda ingat untuk menambahkan "mengimplementasikan OnItemLongClickListener" ke deklarasi kelas Anda?
barry
lihat di xml apakah klik panjang diaktifkan?
Menghubungkan kehidupan dengan Android
Mungkin Anda memiliki Pendengar Gerakan atau sesuatu seperti ini yang menangkap pers lama dan mengkonsumsinya.
Jon Zangitu

Jawaban:

317

Anda harus mengatur setOnItemLongClickListener () di 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 untuk setiap item dalam daftar (harus Anda gunakan XML kustom) juga harus memiliki android:longClickable="true"(atau Anda dapat menggunakan metode kenyamanan lv.setLongClickable(true);). Dengan cara ini Anda dapat memiliki daftar dengan hanya beberapa item yang merespons klik panjang.

Semoga ini bisa membantu Anda.

Dinesh Sharma
sumber
25
Pastikan untuk menelepon lv.setLongClickable(true);juga.
Chris Lacy
15
Ini tidak berhasil untuk saya. Tapi ini tidak:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Luis A. Florit
entah bagaimana adroid: longClickable = "true" adalah default. Saya menggunakan API 19. Jadi saya tidak perlu menentukannya sama sekali.
user1592714
2
Android menetapkan longClickable = true saat mengatur pendengar.
Steven Spungin
nilai apa yang disimpan dalam id panjang? di boolean publik onItemLongClick (AdapterView <?> arg0, Lihat arg1, int pos, id panjang
Femn Dharamshi
26

Jika item baris ListView Anda merujuk ke file XML yang terpisah, pastikan untuk menambahkan android:longClickable="true"file tata letak itu selain pengaturan setOnItemLongClickListener()ke ListView Anda.

Jonathan Lin
sumber
Terima kasih! Memukul kepalaku dengan yang ini.
Shaihi
15

atau coba kode ini:

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;
            }
}); 
Ardi
sumber
6

Saya pikir kode di atas ini akan berfungsi pada LongKlik daftar tampilan, bukan item individual.

mengapa tidak digunakan registerForContextMenu(listView) . dan kemudian mendapatkan panggilan balik di OnCreateContextMenu.

Untuk sebagian besar kasus penggunaan, ini akan berfungsi sama.

nandeesh
sumber
2

Di xml tambahkan

<ListView android:longClickable="true">

Dalam file java

lv.setLongClickable(true) 

coba setOnItemLongClickListener ini ()

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;
            }
        });
Vijay Sharma
sumber
1

ini seharusnya bekerja

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

juga jangan lupa di xml Anda android:longClickable="true"atau jika Anda memiliki tampilan kustom tambahkan ini ke kelas tampilan kustom AndayouCustomView.setLongClickable(true);

di sini adalah output dari kode di atas masukkan deskripsi gambar di sini

Ayoub
sumber
1

Saya mencoba sebagian besar jawaban ini dan semuanya gagal untuk TextViews yang mengaktifkan tautan otomatis tetapi juga harus menggunakan pers lama di tempat yang sama!

Saya membuat kelas khusus yang berfungsi.

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();
    }
}
Oliver Dixon
sumber
0

Ini bekerja untuk saya untuk cardView dan akan bekerja sama untuk listview di dalam adaptor adaptor, dalam onBindViewHolder()fungsi

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

Jika Anda ingin melakukannya di adaptor, Anda cukup melakukan ini:

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

Pasti berhasil.

Kalaiyo5
sumber