web-dev-qa-db-ja.com

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

リストビューに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;
            }
}); 
143
techayu

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);を使用できます)。このようにして、ロングクリックに反応するいくつかの項目だけを含むリストを持つことができます。

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

303
Dinesh Sharma

ListView row項目が別のXMLファイルを参照している場合は、ListViewにsetOnItemLongClickListener()を設定することに加えて、必ずそのレイアウトファイルにAndroid:longClickable="true"を追加してください。

23
Jonathan Lin

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

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

上記のコードは、個々の項目ではなく、リストビューのLongClickingで機能すると思います。

なぜ registerForContextMenu(listView) を使わないのですか。そしてOnCreateContextMenuでコールバックを取得します。

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

6
nandeesh

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;
            }
        });
2
Vijay Sharma

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

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

1
Ayoub

私はこれらの答えのほとんどを試してみました、そしてそれらはすべて自動リンクが有効になっていただけでなく同じ場所で長押しを使わなければならなかった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();
    }
}
1
Oliver Dixon

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

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

あなたがアダプタでそれをやりたいならば、あなたは単にこれをすることができます:

itemView.setOnLongClickListener(new View.OnLongClickListener()
        {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
            }
        });
0
user846316