Listview Проведите внутри видоискателя - PullRequest
3 голосов
/ 28 мая 2010

Я пытаюсь провести пальцем влево и вправо по списку и получить видоискатель к swtich. Точно так же, как приложение Rememberberthemilk и приложение новостей и погоды по умолчанию на Nexus One (пролистывание новостных тем). Используя различные учебники, которые я нашел, я наткнулся на один стековый поток, который показывает, как реализовать жест смахивания

    class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return true;
            // right to left swipe
            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {


            }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                viewFlipper.setInAnimation(slideRightIn);
                viewFlipper.setOutAnimation(slideRightOut);
                viewFlipper.showPrevious();
            }
        } catch (Exception e) {
            // nothing
        }
        return true;
    }
}

И я получил эту работу, выполнив

  lstView.setOnTouchListener(gestureListener);

Однако иногда случается, что listView setOnItemClickListener запускается, когда человек проводит пальцем по экрану. Как мне предотвратить это, и вызвать setOnItemClickListener только тогда, когда пользователь фактически щелкает по этому элементу списка, а не просто проводит по нему пальцем.

Спасибо, Фейсал Абид

Ответы [ 3 ]

2 голосов
/ 28 мая 2010

Хорошо, я нашел один способ, вместо того, чтобы полагаться на onItemClick, который я реализовал

@Override
 public boolean onSingleTapConfirmed(MotionEvent e) {

     // TODO Auto-generated method stub
     Log.e("Item Click", "Item Click");
     return super.onSingleTapConfirmed(e);

 }

Внутри SimpleOnGestureListener, и кажется, что он работает

1 голос
/ 19 января 2013

Вот способ, которым я пользуюсь. это очень просто.

Когда вы назначаете onTouchListener для ViewFlipper, сначала создайте ссылку для этого слушателя.

public class ViewFlipperTouchListener implements OnTouchListener {
   ....
   ......
}


ViewFlipperTouchListener listener = new ViewFlipperTouchListener ();

mViewFlipper.setOnTouchListener(listener);



//now you have reference to listener. use it to send on touch event.


mListView.setOnTouchListener(new OnTouchListener(){

  @Override
  public boolean onTouch(View v, MotionEvent event){
     listener.onTouch(v, event);
 return false;
  }
});

Я просто делегировал MotionEvent в onTouchListener viewflipper, используя ссылку «listener». И вернуть false, чтобы подразумевать, что событие не используется в ListView. Это поможет вам прокрутить список вниз и вверх и делегировать все (прокрутка вниз / вверх и пролистывание влево / вправо ... и т. Д. Для слушателя).

Верь в это. это хорошо работает: D

0 голосов
/ 28 мая 2010

Я думаю, что вы не можете ничего с этим поделать, кроме как играть со своими константами в вашем коде, так что его лучше решать, если пользователь нажал или хочет провести пальцем. Например, я сделал это следующим образом в своем коде (я использовал сенсорное событие, но принцип должен быть похожим):

@Override
public boolean onTouch(View view, MotionEvent event) {

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        {
            downXValue = event.getX();
            downTime = event.getEventTime();
            break;
        }

    case MotionEvent.ACTION_UP:
        {
            float currentX = event.getX();
            long currentTime = event.getEventTime();
            float difference = Math.abs(downXValue - currentX);
            long time = currentTime - downTime;

            Log.i("Touch Event:", "Distance: " + difference + "px Time: " + time + "ms");

            if ((downXValue < currentX) && (time > 50) && (difference > 50)) {
                showPrevious();
            }

            if ((downXValue > currentX) && (time > 50) && (difference > 50)) {
                showNext();
            }
            break;
        }
    }
}

Как вы видите, я поместил вывод журнала там. Так что я только что протестировал приложение и каждый раз, когда я пытался щелкнуть или щелкнуть, журнал сказал мне, как долго я нажимал и насколько велика была разница. Поэтому я корректировал свои значения в условии if, пока он не работал почти во всех случаях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...