2014-01-28 3 views
0

Я реализовал детектор жестов, чтобы узнать, когда пользователь перейдет в мой список (и когда появится последний элемент списка), чтобы я мог добавить больше данных в список. В списке есть пользовательский адаптер, который я создал. Каждая строка имеет несколько текстовых изображений в ней и кнопку изображения. Я использовал кнопку imagebutton (которая является стрелкой) с прослушивателем кликов в моем адаптере, чтобы открыть другое действие, связанное с нажатой строкой.Обнаружение прокрутки в Listview не работает для пользовательского адаптера Listview

Управление хочет, чтобы пользователь мог щелкнуть в любом месте строки, чтобы активировать его. Итак:

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) 
     { 
     View v = convertView; 
      final ViewHolder viewHolder; 
..... 
      //viewHolder.ibShipmentDetails.setOnClickListener(new OnClickListener() 
      v.setOnClickListener(new OnClickListener() 
      { 
       @Override 
       public void onClick(View view) 
        { 
        .... 
        } 
     } 

Но теперь мой детекторы не будут работать правильно. Иногда он реагирует, а потом работает правильно; перезапустите действие, снова он не работает.

Вот мой жест детектор:

class MyGestureDetector extends GestureDetector.SimpleOnGestureListener 
     { 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 


    if((e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY)) 
       { 


       if(!loading && ((totalItemCount - visibleItemCount) <= firstVisibleItem)) 
        { 
         if(allTabSelected) 
          { 
            allPageNo++; 
          } 
         else 
          { 
           openPageNo++; 
           } 

         new GetShipmentPreviews().execute(1); 
        } 
       } 
     } 

И в моей деятельности:

  gestureDetector = new GestureDetector(this, new MyGestureDetector()); 
      gestureListener = new View.OnTouchListener() 
       { 
        public boolean onTouch(View v, MotionEvent event) 
         {        
         return gestureDetector.onTouchEvent(event); 
         } 
       }; 

      listView.setOnTouchListener(gestureListener); 

Что я должен сделать, чтобы сохранить v.setOnClickListener и команда onFling() без изменений?

+0

Просто попытался добавить LiniarLayout по всему ряду и установить OnClick на этом. Такая же проблема, работает ... иногда. – Sebek

ответ

1

Оказывается, мои MotionEvents из onFling равны нулю. Это, по-видимому, происходит потому, что событие каким-то образом «съедено» с помощью onClickListener из моего пользовательского адаптера.

Я получил решение от этого ответа: https://stackoverflow.com/a/7159738/1688731

я добавил следующий код в моем классе активность:

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) 
{ 
    super.dispatchTouchEvent(ev); 
    return gestureScanner.onTouchEvent(ev); 
} 
1

Один раз вы должны использовать listViev.setOnItemClickListener(), а не звонить v.setOnClickListener() для всех элементов списка.

+0

Боюсь, что это не сработает. :(Я просто попытался. Я думаю, что это потому, что я использую настраиваемый адаптер. – Sebek

+0

У вас есть виды в элементах списка, с настраиваемым или кликабельным атрибутом = true? Вам нужно изменить его на false. Если нет, вы можете попробовать укажите его для представления корневого элемента с ложным значением. v.setOnClickListener() может автоматически активировать кликабельность и фокусировать. – Ganster41

+0

Я думаю, что я нашел проблему. Код идет через onFling, но почему-то 'getY()' для motionevent e1 и e2 возвращает null. – Sebek

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