0

我已经为我的列表视图项目实现了一个手势检测器,在检测到 onfling 手势时,将显示两个按钮。前几个列表项运行良好。

但是,当我滚动到列表视图的底部时,onfling 不适用于列表视图的最后一项,因此没有显示两个按钮。PS:我仍然能够获得最后一个列表项的位置。我目前正在我的 ListFragment 类中实现这一点。

我应该怎么做才能使 onFling 能够处理我的最后一个列表项?感谢您的任何帮助。

用代码编辑

public class ExampleFragment extends ListFragment{
    protected GestureDetector gestureDetector;


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        gestureDetector = new GestureDetector(getActivity(), new MyGestureDetector());
        getListView().setOnTouchListener(new OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {
              if (gestureDetector.onTouchEvent(event)) {
                  MotionEvent cancelEvent = MotionEvent.obtain(event);
                  cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
                  v.onTouchEvent(cancelEvent);
                  return true;
              }
              return false;
          }
      });  
}

 class MyGestureDetector extends SimpleOnGestureListener {

      @Override
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            int pos = getListView().pointToPosition((int)e1.getX(), (int)e1.getY());

          try {
              if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                      return false;

              if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                  Toast.makeText(getActivity(), "Left Swipe", Toast.LENGTH_SHORT).show();
              }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Toast.makeText(getActivity(), "Right Swipe", Toast.LENGTH_SHORT).show();
                    View v =  getListView().getChildAt(pos);

                     if (v != null) {
                        Button edit = (Button) v.findViewById(R.id.edit);
                        Button connect = (Button) v.findViewById(R.id.connect); 
                        if (edit.getVisibility() == View.GONE && connect.getVisibility() == View.GONE){
                            edit.setVisibility(View.VISIBLE);
                               connect.setVisibility(View.VISIBLE);
                           }
                    } 

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }

    }
4

1 回答 1

0

@pskink,多亏了你,你的评论确实给了我一些想法,适配器实际上并没有保留视图本身,listview 保留视图并将它们传递给适配器。然后适配器将重新创建视图。以下是编辑后的运行源代码,希望对遇到同样问题的人有所帮助。

public class ExampleFragment extends ListFragment{
protected GestureDetector gestureDetector;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    gestureDetector = new GestureDetector(getActivity(), new MyGestureDetector());
    getListView().setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
          if (gestureDetector.onTouchEvent(event)) {
              MotionEvent cancelEvent = MotionEvent.obtain(event);
              cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
              v.onTouchEvent(cancelEvent);
              return true;
          }
          return false;
      }
  });  
}

class MyGestureDetector extends SimpleOnGestureListener {

  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        int pos = getListView().pointToPosition((int)e1.getX(), (int)e1.getY());

      try {
          if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                  return false;

          if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
              Toast.makeText(getActivity(), "Left Swipe", Toast.LENGTH_SHORT).show();
          }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Toast.makeText(getActivity(), "Right Swipe", Toast.LENGTH_SHORT).show();
                final View v = getListView().getAdapter().getView(pos, null, getListView());
                 if (v != null) {
                    Button edit = (Button) v.findViewById(R.id.edit);
                    Button connect = (Button) v.findViewById(R.id.connect); 
                    if (edit.getVisibility() == View.GONE && connect.getVisibility() == View.GONE){
                        edit.setVisibility(View.VISIBLE);
                           connect.setVisibility(View.VISIBLE);
                       }
                } 

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

}
于 2014-02-26T03:31:43.007 回答