2012-01-13 5 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

長いクリックが有効かどうかを確認しますか? –

+0

クラス宣言に "Implements OnItemLongClickListener"を追加したことを思い出しましたか? – barry

+0

ジェスチャー・リスナーなどがあり、これを長押しして消費しているのかもしれません。 –

答えて

281

あなたは(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);も必ず呼び出してください。 –

+14

これは私のためには機能しませんでした。しかし、これは: 'lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){...} –

+0

何とかadroid:longClickable =" true "がデフォルトです。私はAPI 19を使用しています。 – user1592714

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

をあなたのリストビュー項目は別のXMLファイルを参照する場合は、あなたのリストビューにsetOnItemLongClickListener()の設定に加えて、そのレイアウトファイルにandroid:longClickable="true"を追加してください。

+0

ありがとう!私の頭をこれで叩いていました。 – Shaihi

0

これは、カスタムビューは、カスタムビュークラスここyouCustomView.setLongClickable(true);

にこれを追加している場合は、あなたのxmlにandroid:longClickable="true"がまたはコードの出力であることを忘れてはいけないも

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

を動作するはずです上記 enter image description here

0

私はこれらの回答のほとんどを試しましたが、オートリンクを有効にしたテキストビューでは失敗しましたが、同じ場所で長いプレスを使用しなければなりませんでした。

私は動作するカスタムクラスを作った。

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(); 
    } 
} 
関連する問題