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

时间:2015-05-12 09:50:44

标签: android android-listview pull-to-refresh swipe-gesture

我正在使用Android ListView。我通过 XListView 实现了pull刷新,但是现在我还要实现从左向右滑动以在此ListView上显示按钮List Item。我该怎么做?或者如何在ListView上添加2个libs。

我在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" /> 

3 个答案:

答案 0 :(得分:5)

@Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = MotionEventCompat.getActionMasked(ev); final float x = ev.getX(); final float 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

答案 1 :(得分:2)

不要使用任何lib进行滑动,创建自己的视图,然后使用Pull刷新相同的lib。

就这样做。

添加班级名称。

<强> 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 mathod调用它。我从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();          
        }
    });

答案 2 :(得分:0)

您可以使用Navigation Drawe r或在ViewPager中使用XListView - 其中页面(片段)将包含XListView,另一个包含您的按钮。