English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Введение: Иногда, при отображении большого количества полей в 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 (во время отправки письма замените # на @) для отчета и предоставьте соответствующие доказательства. При подтверждении мы немедленно удалим спорное содержание.