Android ListView 拉动以刷新并滑动列表项以显示按钮

Android ListView Pull to refresh and Swipe List item to reveal buttons

我正在研究 Android ListView。我通过 XListView 实现了下拉刷新,但现在我还想实现从左向右滑动以显示此 ListView 上的按钮列表项。我该怎么做?或者如何在 ListView 上添加 2 个相同的库。

我在 XML 中的 ListView 是。

<com.orderlyexpo.www.listview.refresh.XListView
        android:id="@+id/lvOrders"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@color/gray_text"
        android:dividerHeight="@dimen/dp1x" /> 

您可以使用 Navigation Drawer 或者将 XListView 放在 ViewPager 中 - Page(fragment) 上的位置将包含 XListView 和其他按钮。

不要使用任何库进行滑动,创建自己的视图,您可以使用 Pull 来刷新相同的库。

就这样吧。

添加一个 class 名称。

SwipeDetector.java

public class SwipeDetector implements View.OnTouchListener {

public static enum Action {
    LR, // Left to Right
    RL, // Right to Left
    TB, // Top to bottom
    BT, // Bottom to Top
    None // when no action was detected
}

private static final String logTag = "SwipeDetector";
private static final int MIN_DISTANCE = 100;
private float downX, downY, upX, upY;
private Action mSwipeDetected = Action.None;

public boolean swipeDetected() {
    return mSwipeDetected != Action.None;
}

public Action getAction() {
    return mSwipeDetected;
}

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN: {
        downX = event.getX();
        downY = event.getY();
        mSwipeDetected = Action.None;
        return false; // allow other events like Click to be processed
    }
    case MotionEvent.ACTION_MOVE: {
        upX = event.getX();
        upY = event.getY();

        float deltaX = downX - upX;
        float deltaY = downY - upY;

        // horizontal swipe detection
        if (Math.abs(deltaX) > MIN_DISTANCE) {
            // left or right
            if (deltaX < 0) {
           //     Logger.show(Log.INFO,logTag, "Swipe Left to Right");
                mSwipeDetected = Action.LR;
                return true;
            }
            if (deltaX > 0) {
          //      Logger.show(Log.INFO,logTag, "Swipe Right to Left");
                mSwipeDetected = Action.RL;
                return true;
            }
        } else 

            // vertical swipe detection
            if (Math.abs(deltaY) > MIN_DISTANCE) {
                // top or down
                if (deltaY < 0) {
           //         Logger.show(Log.INFO,logTag, "Swipe Top to Bottom");
                    mSwipeDetected = Action.TB;
                    return false;
                }
                if (deltaY > 0) {
           //         Logger.show(Log.INFO,logTag, "Swipe Bottom to Top");
                    mSwipeDetected = Action.BT;
                    return false;
                }
            } 
        return true;
    }
    }
    return false;
}
}

然后从您的 ListView 或 item onClickListner 方法中调用它。我从 baseadapter 的 ItemClick 调用它。

convertView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(swipeDetector.swipeDetected()) {
            if(swipeDetector.getAction() == Action.LR) {
                viewHolder.chatButton.setVisibility(View.VISIBLE);
                //outterLayout
                RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                relativeParams.addRule(RelativeLayout.RIGHT_OF, viewHolder.chatButton.getId());
                relativeParams.setMargins(20, 0, 0, 0);
                viewHolder.outterLayout.setLayoutParams(relativeParams);
                viewHolder.tvDeliver.setVisibility(View.GONE);
                return;
            } else {
                viewHolder.chatButton.setVisibility(View.GONE);
                RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
                relativeParams.setMargins(0, 0, 0, 0);
                viewHolder.outterLayout.setLayoutParams(relativeParams);
                return;
            }
        } 
            Toast.makeText(context, "Click", 2000).show();          
        }
    });

@覆盖 public boolean onInterceptTouchEvent(MotionEvent ev) { int 动作 = MotionEventCompat.getActionMasked(ev); 最终浮动 x = ev.getX(); 最终浮动 y = ev.getY();

    if (isEnabled() && touchListener.isSwipeEnabled()) {

        if (touchState == TOUCH_STATE_SCROLLING_X) {
            return touchListener.onTouch(this, ev);
        }

        switch (action) {
            case MotionEvent.ACTION_MOVE:
                checkInMoving(x, y);
                return touchState == TOUCH_STATE_SCROLLING_Y;
            case MotionEvent.ACTION_DOWN:
                super.onInterceptTouchEvent(ev);
                touchListener.onTouch(this, ev);
                touchState = TOUCH_STATE_REST;
                lastMotionX = x;
                lastMotionY = y;
                return false;
            case MotionEvent.ACTION_CANCEL:
                touchState = TOUCH_STATE_REST;
                break;
            case MotionEvent.ACTION_UP:
                touchListener.onTouch(this, ev);
                return touchState == TOUCH_STATE_SCROLLING_Y;
            default:
                break;
        }
    }

    return super.onInterceptTouchEvent(ev);
}

/**
 * Check if the user is moving the cell
 *
 * @param x Position X
 * @param y Position Y
 */
private void checkInMoving(float x, float y) {
    final int xDiff = (int) Math.abs(x - lastMotionX);
    final int yDiff = (int) Math.abs(y - lastMotionY);

    final int touchSlop = this.touchSlop;
    boolean xMoved = xDiff > touchSlop;
    boolean yMoved = yDiff > touchSlop;

    if (xMoved) {
        touchState = TOUCH_STATE_SCROLLING_X;
        lastMotionX = x;
        lastMotionY = y;
    }

    if (yMoved) {
        touchState = TOUCH_STATE_SCROLLING_Y;
        lastMotionX = x;
        lastMotionY = y;
    }
}

Use this library