как реализовать прослушиватель длинного клика в списке

Я хочу добавить 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;
            }
}); 

person techayu    schedule 13.01.2012    source источник
comment
Вы не забыли добавить реализации OnItemLongClickListener в объявление вашего класса?   -  person barry    schedule 13.01.2012
comment
посмотрите в xml, включен ли длинный щелчок?   -  person Connecting life with Android    schedule 13.01.2012
comment
Может быть, у вас есть прослушиватель жестов или что-то подобное, которое улавливает долгое нажатие и потребляет его.   -  person Jon Zangitu    schedule 24.01.2013


Ответы (10)


Вы должны установить setOnItemLongClickListener() в ListView:

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);). Таким образом, у вас может быть список, в котором только некоторые элементы реагируют на длинный щелчок.

Надеюсь, что это поможет вам.

person Dinesh Sharma    schedule 13.01.2012
comment
Не забудьте также позвонить lv.setLongClickable(true);. - person Chris Lacy; 06.01.2013
comment
Это не сработало для меня. Но это делает: lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {... - person Luis A. Florit; 16.06.2013
comment
каким-то образом по умолчанию используется adroid:longClickable=true. Я использую API 19. Поэтому мне вообще не нужно было его указывать. - person user1592714; 12.11.2013
comment
Android устанавливает longClickable=true при настройке прослушивателя. - person Steven Spungin; 07.08.2017
comment
какое значение хранится в длинном идентификаторе? in public boolean onItemLongClick(AdapterView‹?› arg0, View arg1, int pos, long id - person Femn Dharamshi; 26.07.2018

Если ваш элемент row в ListView ссылается на отдельный XML-файл, не забудьте добавить android:longClickable="true" в этот файл макета в дополнение к установке setOnItemLongClickListener() в ListView.

person Jonathan Lin    schedule 29.05.2013
comment
Спасибо! Я стучал головой с этим. - person Shaihi; 22.08.2013

или попробуйте этот код:

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;
            }
}); 
person Ardi    schedule 07.01.2013

Я думаю, что этот приведенный выше код будет работать с длинным щелчком по списку, а не по отдельным элементам.

почему бы не использовать registerForContextMenu(listView). а затем получить обратный вызов в OnCreateContextMenu.

Для большинства случаев использования это будет работать одинаково.

person nandeesh    schedule 13.01.2012

В 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;
            }
        });
person Vijay Sharma    schedule 15.04.2018

это должно работать

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

вот вывод кода выше введите здесь описание изображения

person Ayyoub    schedule 30.11.2016

Я пробовал большинство этих ответов, и все они не работали для 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();
    }
}
person Oliver Dixon    schedule 01.12.2016

Это сработало для меня для cardView и будет работать так же для списка внутри адаптера, в функции onBindViewHolder()

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

Если вы хотите сделать это в адаптере, вы можете просто сделать это:

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

    listView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        return false;
    }
});

Определенно делает свое дело.

person Kalaiyo5    schedule 02.09.2019