English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Решение проблемы внедрения ScrollView в item ListView в Android

 Введение: Иногда, при отображении большого количества полей в item ListView, для решения проблемы отображения необходимо поместить item в ScrollView, что приводит к возникновению проблемы: при необходимости обработки событий клика в ListView, из-за использования ScrollView,拦截了ListView的事件:приходится переписывать ListView для его реализации.

/**
* 
* @author Author: Yihuangxing
* 
* @da2016年10月24日 Time:
* 
* @toTODO Class description: Solution to the problem of nesting ScrollView within ListView, where ScrollView intercepts the ListView item click events
* 
* 
* When nesting a ScrollView within a listview, horizontal and vertical scrolling work normally, but it is impossible to click on a listview item. After investigating the Android dispatch mechanism, the problem was solved by inheriting ListView and overriding ListView's onInterceptTouchEvent.
* 
* In onInterceptTouchEvent, always call listview's onTouchEvent to ensure that all listview events are executed,
* super.onInterceptTouchEvent(ev) does not intercept horizontal scrolling that needs to be passed to ScrollView.
*/
public class MyListView extends ListView {
private int flag = 0;
private float StartX;
private float StartY;
public MyListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Always calls the touch event handler of listview
onTouchEvent(ev);
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
StartX = ev.getX();
StartY = ev.getY();
return false;
}
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
float ScollX = ev.getX() - StartX;
float ScollY = ev.getY() - StartY;
// Определение горизонтального или вертикального скольжения, если вертикальное скольжение, блокировать события move и up (если не блокировать, список и ScrollView будут одновременно выполнять скольжение, что приведет к застреванию)
if (Math.abs(ScollX) < Math.abs(ScollY)) {
flag = 1;
return true;
}
return false;
}
if (ev.getAction() == MotionEvent.ACTION_UP) {
if (flag == 1) {
return true;
}
return false;
}
return super.onInterceptTouchEvent(ev);
}
}

Названные выше решения по внедрению ScrollView в item Android ListView, предложенные редактором给大家, hopefully it will be helpful to everyone. If you have any questions, please leave a message, and the editor will reply to everyone in a timely manner. Also, I would like to express my sincere gratitude to everyone for supporting the Nahan tutorial website!

Заявление: содержимое этой статьи было получено из Интернета, авторские права принадлежат их владельцам, контент был自发но предоставлен пользователями Интернета и загружен, сайт не имеет права собственности, не был обработан вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите спорное содержание о нарушении авторских прав, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для отчета и предоставьте соответствующие доказательства. При подтверждении мы немедленно удалим спорное содержание.

Вам может понравиться