2012-01-05 1 views
2

У меня есть ListView в Android, и я хотел бы иметь onTouchListeners для представлений строк и родительского ListView. Я хотел бы ответить на одиночные краны и длинные нажатия на строки по отдельности, но на выбросы в ListView в целом. (Я могу установить метод onFling для каждой из строк по отдельности, но он не является надежным, так как пользователь может переместить палец по строкам.) Я могу успешно установить onTouchListener для строк и ListView отдельно, но когда я set both, ListView listener никогда не запускается - только прослушиватели строк. Это случай, верю ли я true или false в методах прослушивателя строк. Кто-нибудь знает, как запускать onTouchListeners как для представления, так и для его родителя, учитывая, что они занимают одинаковые пиксели на экране?Отдельные onTouchListeners для представления и его родителя

Соответствующий код ListView:

В деятельности OnCreate метод:

mListViewDetector = new GestureDetector(new ListViewGestureListener()); 
mListViewListener = new View.OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     return mListViewDetector.onTouchEvent(event); 
    } 
}; 

mListView = getListView(); 
mListView.setOnTouchListener(mListViewListener); 

и класс пользовательских GestureListener (определяется как вложенного класса в деятельности):

class ListViewGestureListener extends SimpleOnGestureListener { 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     Log.i("ListViewGestureDetector","onFling"); 
     return false; 
    } 

} 

Соответствующий код для отдельных строк в Listview:

В методе BindView из класса адаптера:

TextView textView; 
textView.setOnTouchListener(new ListsTextViewOnTouchListener()); 

и класса пользовательских onTouchListener (определяется как вложенный класс в классе адаптера):

class ItemsTextViewOnTouchListener implements OnTouchListener { 

    public boolean onTouch (View v, MotionEvent event){ 
     switch(event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
      //stuff 
      return false; 
     case MotionEvent.ACTION_CANCEL: 
      //stuff 
      return false; 
     default: 
      break; 
     } 
     return false; 
    } 

} 
+0

Абсолютно, но позвольте мне спросить вас: Вы швыряя прокручивать или швыряя влево/вправо? –

+0

Слева направо. Я использую его для переключения между действиями. – pvans

ответ

1

Pvans,

Ответ немного сложнее, но эта возможность встроена. onTouchEvent() обрабатывает TouchEvent для любого объекта (ов), для которого он является слушателем. Есть два варианта для достижения того, что вы хотели бы.

1) Вы можете переопределить onInterceptTouchEvent() на родительском представлении и обработать ваш бросок там. Я нахожу, что это отлично работает для больших просмотров с меньшими детскими представлениями. Я не предпочитаю этот метод для списков (если честно). onInterceptTouchEvent() является удивительным, когда вы снимаете Touch от детей, но если вы это сделаете, вам придется обрабатывать как рывками влево/вправо, так и прокрутку по горизонтали.

2) Вы также можете создать GestureDetector, что на самом деле является невидимым наложением (вроде). Если вы перешлите на него onTouchEvents, вы по-прежнему получите желаемое поведение, и вам не придется беспокоиться о том, как обращаться с вашей прокруткой вручную. В этом случае вы просто отправляете TouchEvent в детектор, и если он возвращает true, ваш список ничего не делает, и ваш OnFling выполняет эту работу. Если он возвращает false, он не обрабатывается, поэтому он должен принадлежать списку или одному из его дочерних элементов.

Надеется, что это помогает, FuzzicalLogic

+0

Я использую предложение GestureDetector, которое вы сделали, но у меня такая же проблема, независимо от того, верю ли я true или false из ListView Listener или прослушивателей строк. – pvans

+0

Я добавил соответствующие части своего кода. Когда я запускаю его, как показано там, команда Log в ListViewGestureListener никогда не выполняется, когда я бросаю одну из строк. Но если я просто прокомментирую команду 'textView.setOnTouchListener' (чтобы строки больше не имели собственного слушателя, то эта команда Log выполняет.Ваше предложение имеет большой смысл - должно быть что-то простое, что мне не хватает. – pvans

+0

Я не вижу на onInterceptTouch() там, так что да, вы действительно чего-то не замечаете. Было бы лучше, если бы я вытащил часть своего кода, чтобы дать вам пример для работы. Я помню, как это завязывалось со мной около недели, пока я не получил ее самостоятельно. Могли бы вы подождать до завтрашнего вечера, чтобы я мог очистить вас? –

Смежные вопросы