Android 安卓:onScrollStateChanged滚动显示“U STATE”有时不显示“U IDLE”';t火
我遇到了一点问题。我正在做的是:我有一个列表视图,其中有一些图像。为了使滚动更平滑,我禁用了滚动时显示的图像。现在,安卓系统中似乎存在一个问题,它有时会导致滚动状态不会从scroll_state_FLING变回scroll_state_IDLE,从而导致我的图像不再显示 我的第一个想法是设置一个onTouchListener并在我启动ACTION\u时进行检查,但这没有帮助,因为滚动状态\u FLING状态显然是在这之后设置的。所以现在我想我可以在设置SCROLL_STATE_FLING状态时启动一个计时器,并在一段时间后检查该状态是否仍处于FLING模式,然后使我的视图无效。但我认为这不是一个很好的解决方案 有谁对我如何做到这一点有更好的想法吗?我已经看到了回复,但我需要一个API级别<9的解决方案(另外,有时在不过度滚动的情况下也会发生) 以下是我的代码: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状态时启
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这个简单的更改是什么?