0

これは、OnListGestureDetectorTest インターフェイスを実装する setOnListGestureDetectorTest メソッドを呼び出すことによって、ListGestureDetector クラスのメソッドをオーバーライドしようとする Activity クラスのサンプル コードです (以下の 2 番目のサンプル コード)。徹底的なデバッガーを実行すると、オーバーライドされた関数 onRTLFling、onLTRFling、および customOnItemClick が呼び出されないことがわかりました。ListGestureDetector クラスから呼び出される元の空の関数のみがあります。私が間違っていることと、オーバーライドされた関数が呼び出されないのはなぜですか?

    ListGestureDetector listGestureDetectorListener = new ListGestureDetector(
            this, mEarningsListView);

    listGestureDetectorListener
            .setOnListGestureDetectorTest(new ListGestureDetector.OnListGestureDetectorTest() {

                @Override
                public void onRTLFling(int pos) {
                    Log.d(TAG,"onRTLFling");

                }

                @Override
                public void onLTRFling(int pos) {
                    Log.d(TAG,"onLTRFling");

                }

                @Override
                public void customOnItemClick(int position) {
                    Log.d(TAG,"onLTRFling");
                }
            });

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

    mEarningsListView.setOnTouchListener(gestureListener);

そして、これは ListGestureDetector クラスです

public class ListGestureDetector extends SimpleOnGestureListener {

private int REL_SWIPE_MIN_DISTANCE;
private int REL_SWIPE_MAX_OFF_PATH;
private int REL_SWIPE_THRESHOLD_VELOCITY;
private ListView mList;

// Detect a single-click and call my own handler.
@Override
public boolean onSingleTapUp(MotionEvent e) {
    int pos = mList.pointToPosition((int) e.getX(), (int) e.getY());
    customOnItemClick(pos);
    return false;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    if (Math.abs(e1.getY() - e2.getY()) > REL_SWIPE_MAX_OFF_PATH)
        return false;
    if (e1.getX() - e2.getX() > REL_SWIPE_MIN_DISTANCE
            && Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
        int pos = mList.pointToPosition((int) e1.getX(),
                (int) e1.getY());
        onRTLFling(pos);
    } else if (e2.getX() - e1.getX() > REL_SWIPE_MIN_DISTANCE
            && Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
        int pos = mList.pointToPosition((int) e1.getX(),
                (int) e1.getY());
        onLTRFling(pos);
    }
    return false;
}

public ListGestureDetector(Context c, ListView list) {
    super();
    mList = list;
    // Density-aware measurements
    DisplayMetrics dm = c.getResources().getDisplayMetrics();
    REL_SWIPE_MIN_DISTANCE = (int) (120.0f * dm.densityDpi / 160.0f + 0.5);
    REL_SWIPE_MAX_OFF_PATH = (int) (250.0f * dm.densityDpi / 160.0f + 0.5);
    REL_SWIPE_THRESHOLD_VELOCITY = (int) (200.0f * dm.densityDpi / 160.0f + 0.5);
}


interface OnListGestureDetectorTest {
    void customOnItemClick(int position);
    void onRTLFling(int pos);
    void onLTRFling(int pos);
}

public void customOnItemClick(int position) {
}

public void onRTLFling(int pos) {       
}

public void onLTRFling(int pos) {       
}

public void setOnListGestureDetectorTest(OnListGestureDetectorTest ogd) {       
}

}
4

1 に答える 1

0

リンクでリスナーを適切に実装する方法を見つけましたhttp://tseng-blog.nge-web.net/blog/2009/02/17/how-implement-your-own-listener-android-java/

上記のリンクListGestureDetectorクラスに従って変更しました:

public class ListGestureDetector extends SimpleOnGestureListener {

private int REL_SWIPE_MIN_DISTANCE;
private int REL_SWIPE_MAX_OFF_PATH;
private int REL_SWIPE_THRESHOLD_VELOCITY;
private ListView mList;

OnListGestureDetector onListGestureDetector = null;

// Detect a single-click and call my own handler.
@Override
public boolean onSingleTapUp(MotionEvent e) {
    int pos = mList.pointToPosition((int) e.getX(), (int) e.getY());
    onListGestureDetector.customOnItemClick(pos);
    return false;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    if (Math.abs(e1.getY() - e2.getY()) > REL_SWIPE_MAX_OFF_PATH)
        return false;
    if (e1.getX() - e2.getX() > REL_SWIPE_MIN_DISTANCE
            && Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
        int pos = mList.pointToPosition((int) e1.getX(),
                (int) e1.getY());
        onListGestureDetector.onRTLFling(pos);
    } else if (e2.getX() - e1.getX() > REL_SWIPE_MIN_DISTANCE
            && Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
        int pos = mList.pointToPosition((int) e1.getX(),
                (int) e1.getY());
        onListGestureDetector.onLTRFling(pos);
    }
    return false;
}

public ListGestureDetector(Context c, ListView list) {
    super();
    mList = list;
    // Density-aware measurements
    DisplayMetrics dm = c.getResources().getDisplayMetrics();
    REL_SWIPE_MIN_DISTANCE = (int) (120.0f * dm.densityDpi / 160.0f + 0.5);
    REL_SWIPE_MAX_OFF_PATH = (int) (250.0f * dm.densityDpi / 160.0f + 0.5);
    REL_SWIPE_THRESHOLD_VELOCITY = (int) (200.0f * dm.densityDpi / 160.0f + 0.5);
}


interface OnListGestureDetector {
    public abstract void customOnItemClick(int position);
    public abstract void onRTLFling(int pos);
    public abstract void onLTRFling(int pos);
}

public void setOnListGestureDetector(OnListGestureDetector ogd) {   
    onListGestureDetector = ogd;
}

}
于 2012-06-23T10:07:43.173 に答える