聊天应用自定义Adapter getItemCount返回0,RecyclerView滚动异常如何解决?
问题分析与解决方案
我一眼就看出问题出在哪了——你现在调用recyclerView.scrollToPosition(mAdapter.getItemCount()-1)的时机不对!Firebase的ChildEventListener是异步加载数据的,当onStart方法执行到滚动代码时,数据库里的消息还没来得及被拉取并添加到mLsit里,这时候adapter.getItemCount()自然返回0,滚动操作相当于没生效。而之后数据加载完成后,你只调用了notifyDataSetChanged(),但没有再次触发滚动,所以RecyclerView不会自动滚到底部。
修复方案:调整滚动触发时机
把滚动代码移到onChildAdded方法内部,每次完成数据添加和适配器更新后,立即让RecyclerView滚动到最后一项:
@Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { ChatModel model = dataSnapshot.getValue(ChatModel.class); mLsit.add(model); // 这里不需要msgposition,List.add默认追加到末尾 mAdapter.notifyDataSetChanged(); // 滚动到最新消息位置 recyclerView.scrollToPosition(mLsit.size() - 1); }
这里直接用mLsit.size()-1替代mAdapter.getItemCount()-1更稳妥,因为你刚完成数据添加,List的长度就是最新的适配器条目数,避免了适配器可能存在的微小更新延迟。
额外优化建议
- 移除多余的
msgposition变量:List的add(Object)方法会自动将元素追加到列表末尾,不需要手动维护索引,简化代码逻辑。 - 确保适配器与Activity的List引用一致:初始化时要保证
mAdapter是用当前Activity的mLsit实例化的,比如:
// 在Activity初始化阶段 mLsit = new ArrayList<>(); mAdapter = new ChatCustomAdapter(mLsit); recyclerView.setAdapter(mAdapter);
这样数据更新时,适配器才能实时感知到List的变化。
内容的提问来源于stack exchange,提问作者parag pawar
相关产品推荐
相关产品推荐

