2012-01-13 24 views
124

Tôi muốn thêm OnLongClickListener vào chế độ xem danh sách của mình. Bất cứ khi nào người dùng nhấn và giữ 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 người nghe này. Xin vui lòng cho tôi biết nơi tôi đang đi sai. Mã tương tự hoạt động cho setOnItemClickListener rất tốt.cách triển khai trình nghe nhấp chuột dài trên danh sách xem

Đâ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; 
      } 
}); 
+0

xem trong xml cho dù nhấp chuột dài có được bật không? –

+0

Bạn đã nhớ thêm "triển khai OnItemLongClickListener" vào khai báo lớp học chưa? – barry

+0

Có thể bạn có Trình xử lý cử chỉ hoặc một cái gì đó như thế này đang ghi lại báo chí dài và tiêu thụ nó. –

Trả lời

281

Bạn phải thiết lập 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 mỗi mục trong danh sách (bạn nên sử dụng một XML tùy chỉnh) phải có android:longClickable="true" cũng như (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ỉ với một số mục đáp ứng với longclick.

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

+21

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

+14

Điều này không hiệu quả đối với tôi. Nhưng điều này không: 'lv.setOnItemLongClickListener (mới AdapterView.OnItemLongClickListener() {...' –

+0

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 xác định nó ở tất cả – user1592714

5

Tôi nghĩ rằng mã trên này sẽ làm việc trên LongClicking listview, không phải là mặt hàng cá nhân.

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

Đối với hầu hết các trường hợp sử dụng, thao tác này sẽ hoạt động tương tự.

13

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

Nếu ListView bạn hàng mục đề cập đến một tập tin XML riêng biệt, hãy chắc chắn để thêm android:longClickable="true" với file layout trong Ngoài việc thiết lập setOnItemLongClickListener() để ListView của bạn.

+0

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

0

này nên làm việc

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ó một cái nhìn tùy chỉnh thêm video này vào tùy chỉnh xem lớp học của bạn youCustomView.setLongClickable(true);

đây là sản phẩm của mã ở trên enter image description here

0

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 nhưng cũng phải sử dụng báo chí dài ở cùng một nơi!

Tôi đã tạo 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(); 
    } 
} 
Các vấn đề liên quan