2012-01-13 146 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(); 
    } 
}