#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 …’, используя оба вместе, оба будут работать должным образом.