Scroll事件的坑
今天编译自己写的新闻app的时候发现,我的新闻页总是在一下拉的时候就发生崩溃,就用断点调试的方法进行调试,这不调试不要紧调试发现很多问题
在读文章之前大家一定要知道你在屏幕上滑一下在手机中可能是分成好几段进行onSrcoll监听的。
问题一 :连续进行两次监听但是没有执行逻辑
这是源码
waterfall_recyclerView.addOnScrollListener(
new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView
, int dx
, int dy) {
super.onScrolled(recyclerView
, dx
, dy)
;
int totalCount =
layoutManager.getItemCount()
;
int lastPositions
;
lastPositions =
layoutManager.findLastVisibleItemPosition()
;
Toast.
makeText(getActivity()
, "asdfdgds",Toast.
LENGTH_SHORT).show()
;
if ( (totalCount == lastPositions +
1 )
/**&& isLoading == false*/) {
++
page;
isLoading =
true;
presenter.getData(
newsString, String.
valueOf(
page))
;
} 我就对Scoll之后发生的事情进行观察,这里有一个lastPositions代表手机屏上最后一个item在recyclerView中的位置,还有一个参数totalCount表示的是现在已经请求下来的item的总数,这段代码的逻辑是当totalCount ==lastPositions + 1 (为什么是加1的问题我之后会提到) 时就再次进行网络请求,请求新的数据 (由于接口原因每次申请会增加12个新的item),通过监听发现在由于在手机屏幕上的一次滑动在手机看来·可能是分别的几次滑动,当正好滑动到lastPositions=11的时候,这一次的onScrolled方法并没有立即去调用getData方法去进行数据申请,而是接着监听了下一次Scroll,之后才进行了两次网络请求,这个时候我们的totalcount已经变成了36,但是我们的lastPositions只是12。虽然我也不清楚为什么没有在第一次发现totalCount ==lastPositions + 1的时候就进行网络请求,但是只需要加入isLoading这个参数,并在请求前进行判断就可以防止同时进行两次网络请求。
(程序崩溃是我自己的原因),但还是发现了scroll的这个小坑。
问题二:if判断中为什么不能写 totalCount == lastPositions
通过监听发现当lastpostions到达 11时,你的每次滑动dy 非常小,即使你滑的很用力,而且你的这一次滑动在手机看来他分成了两次滑动,第一次是dy是正值,第二次是负值=-dy,这就意味着你的每次滑动都被抵消了,所以永远不可能达到totalCount的12,怀疑是scroll的时候lastPosition==11的时候系统认为11已经到底了,为了防止你划出屏,他就帮你滑回来了,所以造成第一次dy + 第二次dy = 0;
如果有什么写的不对的地方望大神指点。