リストビューにロングクリックリスナーを実装する方法


148

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

クラス宣言に「implements OnItemLongClickListener」を追加したことを覚えていますか?
2012年

長いクリックが有効かどうかをXMLで確認しますか?
Androidと生活をつなぐ

多分あなたはジェスチャーリスナーまたは長押しをキャプチャしてそれを消費しているこのような何かを持っています。
Jon Zangitu 2013年

回答:


317

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);)。このようにして、ロングクリックに応答する一部のアイテムのみを含むリストを作成できます。

これがお役に立てば幸いです。


25
必ずお電話くださいlv.setLongClickable(true);
Chris Lacy 2013年

15
これは私にはうまくいきませんでした。しかし、これはありません:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
ルイス・A. Florit

どういうわけかadroid:longClickable = "true"がデフォルトです。私はAPI 19を使用しています。そのため、それを指定する必要はまったくありませんでした。
user1592714 2013年

2
Androidはリスナーの設定時にlongClickable = trueを設定します。
Steven Spungin 2017

long idに格納される値は何ですか?public boolean onItemLongClick(AdapterView <?> arg0、View arg1、int pos、long id
Femn Dharamshi

26

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


ありがとう!これで頭を叩いてた。
Shaihi 2013

15

またはこのコードを試してください:

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

このコードは、個々のアイテムではなく、リストビューのロングクリックで機能すると思います。

なぜ使用しないでくださいregisterForContextMenu(listView)。その後、OnCreateContextMenuでコールバックを取得します。

ほとんどの場合、これは同じように機能します。


2

XMLに追加

<ListView android:longClickable="true">

Javaファイル

lv.setLongClickable(true) 

この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

これはうまくいくはずです

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

ここに上記のコードの出力があります ここに画像の説明を入力してください


1

私はこれらの回答のほとんどを試してみましたが、オートリンクが有効になっているが同じ場所で長押しする必要があったTextViewではすべて失敗しました!

機能するカスタムクラスを作成しました。

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

これは私のためにcardViewのために働きました、そしてonBindViewHolder()関数内でアダプターcalss内のlistviewのために同じように働きます

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

0

アダプターで実行する場合は、次のようにするだけです。

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

間違いなくトリックを行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.