Android 安卓:onScrollStateChanged滚动显示“U STATE”有时不显示“U IDLE”';t火

Android 安卓:onScrollStateChanged滚动显示“U STATE”有时不显示“U IDLE”';t火,android,listview,scroll,Android,Listview,Scroll,我遇到了一点问题。我正在做的是:我有一个列表视图,其中有一些图像。为了使滚动更平滑,我禁用了滚动时显示的图像。现在,安卓系统中似乎存在一个问题,它有时会导致滚动状态不会从scroll_state_FLING变回scroll_state_IDLE,从而导致我的图像不再显示 我的第一个想法是设置一个onTouchListener并在我启动ACTION\u时进行检查,但这没有帮助,因为滚动状态\u FLING状态显然是在这之后设置的。所以现在我想我可以在设置SCROLL_STATE_FLING状态时启

我遇到了一点问题。我正在做的是:我有一个列表视图,其中有一些图像。为了使滚动更平滑,我禁用了滚动时显示的图像。现在,安卓系统中似乎存在一个问题,它有时会导致滚动状态不会从scroll_state_FLING变回scroll_state_IDLE,从而导致我的图像不再显示

我的第一个想法是设置一个onTouchListener并在我启动ACTION\u时进行检查,但这没有帮助,因为滚动状态\u FLING状态显然是在这之后设置的。所以现在我想我可以在设置SCROLL_STATE_FLING状态时启动一个计时器,并在一段时间后检查该状态是否仍处于FLING模式,然后使我的视图无效。但我认为这不是一个很好的解决方案

有谁对我如何做到这一点有更好的想法吗?我已经看到了回复,但我需要一个API级别<9的解决方案(另外,有时在不过度滚动的情况下也会发生)

以下是我的代码:

    mList.setOnScrollListener(new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            mListAdapter.setIsScrolling(scrollState != SCROLL_STATE_IDLE);
            Log.i(this, "scrollStateChanged" + scrollState);
            if (scrollState == SCROLL_STATE_IDLE) {
                mList.invalidateViews();
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        }
    });
谢谢,
Maria

我也遇到了同样的问题,并发布了一个解决方案:

对于任何仍然遇到这个问题的人(就像我上周一样)来说 对我有效的解决方法如下:如果android SDKInt==7 在
(Abs)列表视图上设置一个
onTouchListener

在该
onTouchListener
中,当
OnTouch
事件操作
MotionEvent.ACTION|u UP | ACTION==MotionEvent.ACTION_CANCEL
一个
onScrollStateChanged
,首先是一个
滚动\u STATE\u FLING
,然后是一个
SCROLL\u STATE\u IDLE

代码示例:在onCreate中:

  if(androidSDKInt <= 7){
      listViewDateSelector.setOnTouchListener(new FingerTracker(onScrollListener));       }

我也遇到了同样的问题,所以我的解决方案是只检测scrollview位置是否已到达最后一页,在这种情况下,无论滚动状态如何,始终加载图像(因为当用户跳转到listview末尾时,问题似乎总是会发生)。因此,修改代码时,您将:

mList.setOnScrollListener(new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        mListAdapter.setIsScrolling(scrollState != SCROLL_STATE_IDLE);
        Log.i(this, "scrollStateChanged" + scrollState);

        int first = view.getFirstVisiblePosition();
        int count = view.getChildCount();

        if (scrollState == SCROLL_STATE_IDLE || (first + count > mListAdapter.getCount()) ) {
            mList.invalidateViews();
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    }
});

我在一个
RecyclerView
中遇到了同样的问题

recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {

    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        super.onScrollStateChanged(recyclerView, newState)

        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            updateUi()
        }
    }

    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)

        /* If the user scrolls to the edges of the recyclerview, we can't trust that we get the SCROLL_STATE_IDLE state.
         * Therefore we have to update the view here in onScrolled for these cases
         */
        if (!recyclerView.canScrollVertically(1) || !recyclerView.canScrollVertically(-1)) {
            updateUi()
        }
    }
}
是正确的,但我将提供另一种方法来检查您是否位于
RecyclerView
/
ListView
的开头/结尾

recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {

    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        super.onScrollStateChanged(recyclerView, newState)

        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            updateUi()
        }
    }

    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)

        /* If the user scrolls to the edges of the recyclerview, we can't trust that we get the SCROLL_STATE_IDLE state.
         * Therefore we have to update the view here in onScrolled for these cases
         */
        if (!recyclerView.canScrollVertically(1) || !recyclerView.canScrollVertically(-1)) {
            updateUi()
        }
    }
}
我在
onScrolled
中执行此操作,而不是在
onScrollStateChanged
中执行此操作,因为我不相信当您滚动/甩到
回收视图的边缘时会发生状态更改事件

recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {

    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        super.onScrollStateChanged(recyclerView, newState)

        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            updateUi()
        }
    }

    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)

        /* If the user scrolls to the edges of the recyclerview, we can't trust that we get the SCROLL_STATE_IDLE state.
         * Therefore we have to update the view here in onScrolled for these cases
         */
        if (!recyclerView.canScrollVertically(1) || !recyclerView.canScrollVertically(-1)) {
            updateUi()
        }
    }
}
在我的例子中,它实际上是一个水平循环视图,所以我不得不这样做:

if (!recyclerView.canScrollHorizontally(1) || !recyclerView.canScrollHorizontally(-1)) {
    updateUi()
}

但这会导致在空闲状态可能仍处于空闲状态时设置空闲状态,对吗?对。我没想过。在抛出时,它也将调用idle方法。。。这对我的实现来说没有问题,因为抛出仍将继续,当抛出完成时,它将自动重置空闲状态,但我可以想象这可能不会对所有人都有效。不客气。我发现,当你的手指仍在触摸屏幕时,点击listview的一端。因此,这也可能发生在listview的顶部。我的代码也可以修改为始终加载第一页。是的,它也发生在顶部,但这是一个简单的更改。@MariaNeumayer这个简单的更改是什么?