2012-01-13 141 views
124

我想在我的列表视图中添加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; 
      } 
}); 
+0

请参阅xml是否启用长时间点击? – 2012-01-13 07:04:02

+0

您是否记得在您的类声明中添加“implements OnItemLongClickListener”? – barry 2012-01-13 06:35:51

+0

也许你有一个手势监听器或类似的东西,它捕捉长时间按下并消耗它。 – 2013-01-24 08:57:12

回答

281

你必须在ListView设置setOnItemLongClickListener()

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。

希望这会帮助你。

+21

一定要调用'lv.setLongClickable(true);'也是。 – 2013-01-06 05:10:52

+14

这不适合我。但是这样做:'lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){...' – 2013-06-16 03:47:05

+0

somehow adroid:longClickable =“true”是默认的。我使用API​​ 19.所以我根本不需要指定它 – user1592714 2013-11-12 00:21:07

5

我觉得这上面的代码将在LongClicking列表视图,而不是单个项目的工作。

为什么不使用registerForContextMenu(listView)。然后在OnCreateContextMenu中获取回调。

对于大多数使用情况,这将工作相同。

13

或试试这个代码:

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

如果您的ListView 项目是指一个单独的XML文件,一定要另外加android:longClickable="true"到布局文件设置setOnItemLongClickListener()您的ListView。

+0

谢谢!这是我的头撞。 – Shaihi 2013-08-22 10:39:24

0

这应该工作

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

这里是代码的输出以上 enter image description here

0

我尝试了大多数这些答案,他们都失败了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(); 
    } 
}