gpt4 book ai didi

java - Android:在 ListView 上垂直滑动(禁用滚动)

转载 作者:太空狗 更新时间:2023-10-29 16:39:09 24 4
gpt4 key购买 nike

我尝试了很多解决方案,但找不到任何有效的方法。我的 ListView 中的每个元素都占据了整个屏幕。我想使用垂直滑动手势从一个元素导航到下一个元素。我当前的设置现在可以自由滚动,但我想禁用它并只允许垂直向上和向下滑动。每次滑动(取决于方向)都应该将我带到 ListView 中的下一个连续元素并卡入到位。

这是我当前的代码:

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:

if (scrolling){
// get first visible item
RelativeLayout item = (RelativeLayout) view.getChildAt(0);
int top = Math.abs(item.getTop()); // top is a negative value
int botton = Math.abs(item.getBottom());
if (top >= botton){

//((ListView)view).setSelectionFromTop(view.getFirstVisiblePosition()+1, 0);
((ListView)view).smoothScrollToPositionFromTop(view.getFirstVisiblePosition()+1, 0, 1);

} else {
((ListView)view).smoothScrollToPositionFromTop(view.getFirstVisiblePosition(), 0, 1);

}
}

scrolling = false;
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:


case OnScrollListener.SCROLL_STATE_FLING:
scrolling = true;
break;

}
}

我怎样才能实现这一目标?

最佳答案

如果您想禁用内置滚动 - 您需要稍微欺骗 AbsListView 并从中隐藏 ACTION_MOVE 运动事件。通过这种方式,您可以获得随 ListView 一起提供的所有触摸系统,但滚动将被禁用。

我在我的示例中所做的 - 是我将 CANCEL 事件发送到底层 AbsListView 并手动处理滚动触摸事件。

这是我想出的。可能不是最佳解决方案,但它证明了这个概念:)

/**
* Created by paveld on 1/13/14.
*/
public class CustomListView extends ListView {

private float touchSlop = 0;
private float downY = 0;
private boolean consumeTouchEvents = false;

public CustomListView(Context context) {
super(context);
init();
}

public CustomListView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public CustomListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}

private void init() {
touchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
boolean isHandled = true;
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_MOVE:
float distance = downY - ev.getY();
if (!consumeTouchEvents && Math.abs(distance) > touchSlop) {

//send CANCEL event to the AbsListView so it doesn't scroll
ev.setAction(MotionEvent.ACTION_CANCEL);
isHandled = super.onTouchEvent(ev);
consumeTouchEvents = true;
handleScroll(distance);
}
break;
case MotionEvent.ACTION_DOWN:
consumeTouchEvents = false;
downY = ev.getY();
//fallthrough
default:
if (!consumeTouchEvents) {
isHandled = super.onTouchEvent(ev);
}
break;

}
return isHandled;
}

private void handleScroll(float distance) {
if (distance > 0) {
//scroll up
if (getFirstVisiblePosition() < getAdapter().getCount() - 1) {
smoothScrollToPositionFromTop(getFirstVisiblePosition() + 1, 0, 300);
}
} else {
//scroll down
if (getFirstVisiblePosition() > 0) {
smoothScrollToPositionFromTop(getFirstVisiblePosition() - 1, 0, 300);
}
}
}
}

关于java - Android:在 ListView 上垂直滑动(禁用滚动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21101056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com