Làm thế nào để thực hiện một người nghe nhấp chuột dài trên một listview


148

Tôi muốn thêm OnLongClickListenervào xem danh sách của tôi. Bất cứ khi nào người dùng nhấn lâu vào mục trong danh sách, một số hành động sẽ được thực hiện, nhưng mã của tôi không bắt được trình nghe này. Xin vui lòng cho tôi biết tôi đang đi sai ở đâu. Các mã tương tự làm việc setOnItemClickListenerrất tốt.

Đây là mã:

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

Bạn có nhớ thêm "thực hiện OnItemLongClickListener" vào khai báo lớp của mình không?
barry

xem trong xml liệu nhấp dài có được kích hoạt không?
Kết nối cuộc sống với Android

Có thể bạn có một Trình lắng nghe cử chỉ hoặc một cái gì đó như thế này đang thu hút báo chí lâu dài và tiêu thụ nó.
Jon Zangitu

Câu trả lời:


317

Bạn phải đặt setOnItemLongClickListener () trong 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 cho từng mục trong danh sách (bạn nên sử dụng XML tùy chỉnh) cũng phải có android:longClickable="true"(hoặc bạn có thể sử dụng phương thức tiện lợi lv.setLongClickable(true);). Bằng cách này, bạn có thể có một danh sách chỉ có một số mục phản hồi với longclick.

Hy vọng điều này sẽ giúp bạn.


25
Hãy chắc chắn để gọi lv.setLongClickable(true);cũng.
Chris Lacy

15
Điều này đã không làm việc cho tôi. Nhưng điều này có:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Luis A. Florit

bằng cách nào đó adroid: longClickable = "true" là mặc định. Tôi đang sử dụng API 19. Vì vậy, tôi không cần phải chỉ định nó.
dùng1592714

2
Android đặt longClickable = true khi cài đặt trình nghe.
Steven Spungin

giá trị nào được lưu trữ trong id dài? trong boolean công khai onItemLongClick (AdapterView <?> arg0, Xem arg1, int pos, id dài
Femn Dharamshi 26/07/18

26

Nếu mục hàng ListView của bạn đề cập đến một tệp XML riêng, hãy chắc chắn thêm android:longClickable="true"vào tệp bố cục đó ngoài cài đặt setOnItemLongClickListener()cho ListView của bạn.


Cảm ơn! Đã đập đầu tôi với cái này.
Shaihi

15

hoặc thử mã này:

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

Tôi nghĩ đoạn mã trên sẽ hoạt động trên LongClicking listview, không phải các mục riêng lẻ.

tại sao không sử dụng registerForContextMenu(listView) . và sau đó nhận được cuộc gọi lại trong OnCreateContextMothy.

Đối với hầu hết các trường hợp sử dụng, điều này sẽ làm việc như nhau.


2

Trong xml thêm

<ListView android:longClickable="true">

Trong tập tin java

lv.setLongClickable(true) 

hãy thử 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

cái này nên hoạt động

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

cũng đừng quên trong xml của bạn android:longClickable="true"hoặc nếu bạn có chế độ xem tùy chỉnh, hãy thêm nó vào lớp xem tùy chỉnh của bạnyouCustomView.setLongClickable(true);

đây là đầu ra của đoạn mã trên nhập mô tả hình ảnh ở đây


1

Tôi đã thử hầu hết các câu trả lời này và tất cả đều thất bại đối với TextViews đã bật tự động bật nhưng cũng phải sử dụng báo chí dài ở cùng một nơi!

Tôi đã thực hiện một lớp tùy chỉnh hoạt động.

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

Điều này làm việc cho tôi cho cardView và sẽ hoạt động tương tự cho listview bên trong bộ điều hợp bộ điều hợp, trong onBindViewHolder()chức năng

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

0

Nếu bạn muốn làm điều đó trong bộ chuyển đổi, bạn chỉ cần làm điều này:

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

Chắc chắn là có mẹo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.