Fragment启动时如何让RecyclerView滚动到指定位置实现通知跳转评论功能
问题根因与修复方案
你的滚动逻辑无效的核心原因是滚动调用时机早于Firebase数据加载完成时间,结合你给出的代码,具体修改方案如下:
1. 执行顺序错误修正
你当前的代码执行顺序存在逻辑问题:
- 先调用
scrollToPosition(),再执行adapter.startListening()加载Firebase数据
滚动调用时Adapter还没有拿到任何数据,RecyclerView条目数量为0,滚动自然没有效果。需要调整顺序,先启动数据监听,等数据加载完成后再执行滚动。
2. 添加数据加载完成监听
给FirebaseRecyclerAdapter注册数据变化观察者,等数据加载完成绑定到RecyclerView后再触发滚动,修改后的SetFirebaseRecyclerAdapter类onPostExecute代码如下:
@Override protected void onPostExecute(Void aVoid) { // 提前给RecyclerView设置布局管理器和适配器,无需放到OnGlobalLayout中 mLinearLayoutManager = new LinearLayoutManager(mContext); mLinearLayoutManager.setReverseLayout(true); mLinearLayoutManager.setStackFromEnd(true); mRecyclerView.setLayoutManager(mLinearLayoutManager); mRecyclerView.setAdapter(adapter); // 监听适配器数据加载完成事件 adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onItemRangeInserted(int positionStart, int itemCount) { super.onItemRangeInserted(positionStart, itemCount); // 首次加载到数据后执行滚动 if (positionStart == 0 && itemCount > 0) { mRecyclerView.scrollToPosition(position); // 滚动完成后注销监听,避免重复触发 adapter.unregisterAdapterDataObserver(this); } } }); // 最后启动Firebase数据监听 adapter.startListening(); }
3. 适配倒序布局的位置转换
因为你开启了setReverseLayout(true),如果你的目标position是按正序计算的,需要做位置转换:倒序布局对应的目标位置为adapter.getItemCount() - 1 - 正序位置。如果需要平滑滚动效果,直接将scrollToPosition替换为smoothScrollToPosition即可。
内容的提问来源于stack exchange,提问作者lin
相关产品推荐
相关产品推荐

