як реалізувати слухач довгих клацань на перегляді списку


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"?
barry

побачте в xml, чи ввімкнено довгий клік?
Підключення життя з Android

Можливо, у вас є слухач жестів або щось подібне, що захоплює довгий натиск і споживає його.
Джон Зангіту

Відповіді:


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);). Таким чином, у вас може бути список, лише деякі елементи відповідають на longclick.

Сподіваюся, що це вам допоможе.


25
Обов’язково телефонуйте lv.setLongClickable(true);також.
Кріс Лейсі

15
Це не спрацювало для мене. Але це так:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Луїс А. Флорит

якось adroid: longClickable = "true" за замовчуванням. Я використовую API 19. Тому мені зовсім не потрібно було вказувати його.
користувач1592714

2
Android встановлює longClickable = true під час налаштування слухача.
Стівен Спунгін

яке значення зберігається у довгому id? у загальнодоступному логічному onItemLongClick (AdapterView <?> arg0, Перегляд arg1, int pos, long id
Femn Dharamshi,

26

Якщо ваш рядок ListView відноситься до окремого XML-файлу, не забудьте додати його android:longClickable="true"до цього файлу макета, крім налаштування setOnItemLongClickListener()до списку ListView.


Дякую! Був моєю головою цим.
Шайхі

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

Я думаю, що цей вище код буде працювати на LongClicking listview, а не на окремі елементи.

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

У більшості випадків використання це буде працювати однаково.


2

У xml додати

<ListView android:longClickable="true">

У файлі java

lv.setLongClickable(true) 

спробуйте цей набірOnItemLongClickListener ()

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.