好的,我已经理解了,这实际上是一个时间问题。对于那些可能在某个时候遇到与我相同问题的人,这是发生的情况:
在我的片段中,我添加了一个OnScrollListener来累加所有dy值,以获取RecyclerView的完整scrollY值:
new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
mScrollY += dy;
}
};
在我的RecyclerView行中,我想使用这个mScrollY值,在RecyclerView滚动时,以视差效果做出响应,因此我在ViewHolder中实现了一个OnScrollListener:
new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
applyParallax(mScrollY);
}
};
我认为,由于ViewHolders被销毁并重用,只在需要时添加子OnScrollListeners是最节约资源的。
我不知道关于RecyclerView的一件事是它的OnScrollListeners按添加顺序处理(这在事后有点显而易见)。由于片段的OnScrollListener首先被添加,而行的OnScrollListeners之后,因此片段的OnScrollListener最后被调用,导致mScrollY值在被行的OnScrollListeners处理后更新,因此它们错过了最后一次更新并停留在倒数第二个mScrollY值,该值为正数。
我通过像这样将所有逻辑实现到片段的OnScrollListener中来解决它(请注意,由于我只需要第一行中的视差效果,因此仅检查第一个子项!如果您在其他位置具有更多效果,则必须循环遍历LayoutManager中的所有当前视图):
new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
mScrollY += dy;
LinearLayoutManager manager = ((LinearLayoutManager) mRecyclerView.getLayoutManager());
View firstChild = manager.getChildAt(0);
if(firstChild.getId() == R.id.fpd_title_super){
final PostDataAdapter.MainTitleViewHolder holder = (PostDataAdapter.MainTitleViewHolder)mRecyclerView.getChildViewHolder(firstChild);
holder.dispatchScrollY(mScrollY);
}
}
};
在ViewHolders中实现一个方法:
public void dispatchScrollY(int scrollY){
}
现在它可以工作了。