Элементы в ListView недолго доступны для просмотра после настройки прослушивателя щелчков в getView ()

#android #android-listview

#Android #android-listview

Вопрос:

Я искал вокруг и не нашел решения (возможно, не используя правильные ключевые слова).

Итак, у меня есть пользовательский ListView, элемент которого можно перетаскивать при длительном нажатии на элемент. Внутри его элемента есть ImageView и LinearLayout, содержащие два TextViews. Действия выполняются при нажатии LinearLayout или ImageView.

Для этого я использую setOnItemLongClickListener в моем DragListView, который расширяет ListView, чтобы инициировать действие перетаскивания, и onInterceptTouchEvent для управления действием перетаскивания.

Затем я создал пользовательский адаптер, расширяющий BaseAdapter, и переопределил его getView () для реализации дочерних элементов в строке. LinearLayout и ImageView были установлены на ClickListener.

Проблема в том, что LinearLayout и ImageView могут выполнять свои функции, но onItemLongClick не вызывается.

Прослушиватель внутри getView();

     holder.delete.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
//Do something
}
  

Для элемента длинный щелчок (инициатор перетаскивания)

 setOnItemLongClickListener(new OnItemLongClickListener() {              

    @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view,
                        int position, long id) {
    //Do something
    }
  

Большое вам спасибо!

Комментарии:

1. Что у вас в представлении элемента списка? Какие элементы управления вы используете?

2. Извините, я не совсем понимаю вопрос. Если я все правильно понял, мой макет более или менее совпадает с показанным здесь , за исключением того, что в моем listview есть setOnItemLongClick

3. @AlvinThen Привет, ты можешь предоставить код для этой функции, чтобы перетаскивать элемент при длительном нажатии и обрабатывать событие щелчка в каждом представлении?

Ответ №1:

Я думаю, что детектор жестов является одним из способов обработки событий. Обычно, однако, детектор жестов используется, когда мы хотим обнаружить жест, а не длительное нажатие.

Причина, по которой onItemLongClick не вызывается, заключается в том, что OnClickListener может использовать событие касания. По этой причине, если вы хотите обработать onItemLongClick, перехватите событие касания и отправьте его в представления, которые вы хотите обработать.

Вы можете найти более подробную информацию по следующей ссылке. http://developer.android.com/guide/topics/ui/ui-events.html

Комментарии:

1. хммм, вы имеете в виду, что в моем пользовательском listview я переопределяю intercepttouchevent, а затем отправляю событие касания в onitemlongclick? чего я не понимаю, так это того, что я не знаю, как сначала отправить событие касания в onitemlongclick, поскольку оно не принимает motionevent в качестве параметра

2. В любом случае, вы сделали setLongClickable (true); для каждого элемента в getView ()?

3. Эй, здорово, setLongClickable в convertView творит волшебство! Спасибо!

Ответ №2:

Хорошо, только что нашел решение самостоятельно. Вместо использования onItemLongClickListener я создаю детектор жестов для определения длительного нажатия. Затем я переопределяю dispatchTouchEvent и сначала заставляю сканировать длительное нажатие, затем возвращаю super.dispatchTouchEvent и другие последующие события касания. Предложения по-прежнему приветствуются!

Комментарии:

1. @James мне жаль, но я больше не владею кодом. если вы столкнулись с точно такой же проблемой, как и я, попробуйте установить Long Clickable (true) в convertView

2. Что ж, если кто-нибудь пришел сюда в поисках решения, то я бы рекомендовал получить событие в getView() адаптере, соответствующем CustomAdapter , и попытаться найти ‘CustomView.onLong …’ или ‘CustomView.onClick …’, используя оба вместе, оба будут работать должным образом.