2012-05-29 2 views
2

Я пытаюсь сделать горизонтальный вид прокрутки для сетки. Я преуспел в горизонтальном просмотре прокрутки. Но теперь мне нужно реализовать onItemClickListener тоже для одного и того же вида сетки. Я использовал GestureDetector.SimpleOnGestureListener и onTouchEvent для горизонтальной прокрутки. Если я использую этот onItemClickListener, он не работает. Кон, помогите мне заставить обоих работать. Заранее спасибо.Как использовать ontouchevent() с прослушивателем onitemclick?

ответ

1

Мне недавно пришлось иметь дело с одной и той же проблемой, и именно так я ее решил.

Во-первых, я переопределяю прослушиватель onListItemClick по умолчанию в ListFragment/ListActivity. Затем в методе onTouchEvent я установил условие, когда true, вызывает вызов ListView onListItemClick. Этот вызов выполняется, когда действие равно MotionEvent.ACTION_UP, и это условие было выполнено. Сначала вы должны решить, какая группа событий представляет собой щелчок для вашего представления. Я объявил себя как ACTION_DOWN, а затем ACTION_UP. Когда вы будете готовы выполнить команду onListItemClick, вам необходимо передать вид, позицию и идентификатор фактического объекта в метод.

См. Мой пример ниже.

Class....{ 
    private boolean clickDetected = true; 

    public boolean onTouchEvent(MotionEvent ev) { 
     final int action = ev.getAction(); 
     final int x = (int) ev.getX(); 
     final int y = (int) ev.getY(); 

     //if an action other than ACTION_UP and ACTION_DOWN was performed 
     //then we are no longer in a simple item click event group 
     //(i.e DOWN followed immediately by UP) 
     if (action != MotionEvent.ACTION_UP 
       && action != MotionEvent.ACTION_DOWN) 
      clickDetected = false; 

     if (action == MotionEvent.ACTION_UP){ 
      //check if the onItemClick requirement was met 
      if (clickDetected){ 
       //get the item and necessary data to perform onItemClick 
       //subtract the first visible item's position from the current item's position 
       //to compensate for the list been scrolled since pointToPosition does not consider it 
       int position = pointToPosition(x,y) - getFirstVisiblePosition(); 
       View view = getChildAt(position); 
       if (view != null){//only continue if a valid view exists 
        long id = view.getId(); 
        performItemClick(view, position, id);//pass control back to fragment/activity 
       }//end if 
      }//end if 

      clickDetected= true;//set this to true to refresh for next event 
     }//end if 
     return super.onTouchEvent(ev); 
     .... 
    }//end onTouchEvent 
}//end class 

Эта установка позволит много гибкости, например, если вы хотите создать длинный клик вы можете сделать то же самое, что и выше, и простая проверка на разницу во времени между ACTION_DOWN и ACTION_UP.

Другой подход заключается в том, чтобы получить позицию элемента, который инициировал действие, и проверить его против одного для действия вверх и даже выбросить критерии дифференциального по времени для действия вниз и вверх (скажем, менее 1 секунды) ,

+0

Хороший aproach, это то, для чего я был логин. Во всяком случае, я хотел бы упомянуть, что это не сработает на некоторых недорогих устройствах. Недавно я заметил, что при тестировании моего нового приложения, в то время как на samsung, asus, gigabite (и т. Д. На обычных устройствах) наблюдалось зарегистрированное ACTION_DOWN, которое немедленно сопровождалось действием ACTION_UP, на недорогих устройствах оно было ACTION_DOWN -> ACTION_MOVE -> ACTION_UP. – vanomart

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