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


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" в ваше объявление класса?
Барри

видите в xml включен ли длинный клик?
Соединение жизни с Android

Может быть, у вас есть Gesture Listener или что-то вроде этого, которое захватывает долгое нажатие и потребляет его.
Джон Зангиту

Ответы:


317

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

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


25
Обязательно позвоните lv.setLongClickable(true);также.
Крис Лейси

15
Это не сработало для меня. Но это делает:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Луис А. Флорит

как-то adroid: longClickable = "true" по умолчанию. Я использую API 19. Поэтому мне не нужно было указывать его вообще.
user1592714

2
Android устанавливает longClickable = true при настройке слушателя.
Стивен Спунгин

какое значение хранится в длинном идентификаторе? в публичном логическом onItemLongClick (AdapterView <?> arg0, View arg1, int pos, long id
Фемн Дхарамши

26

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


Спасибо! Ударялся головой об этом.
Shaihi

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

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

0

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

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

Определенно делает трюк.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.