RecyclerView方法未执行:getItemCount()创建后不调用问题
我之前也踩过这个坑,RecyclerView的getItemCount()没被触发,通常和Adapter数据更新通知、LayoutManager设置、Fragment生命周期绑定这几个点有关,结合你描述的场景(先空RecyclerView,Loader加载数据后创建新Fragment),我整理了几个排查方向和解决方案:
必须确认RecyclerView已设置LayoutManager
这是最容易忽略的致命点!如果RecyclerView没有设置LayoutManager(比如LinearLayoutManager、GridLayoutManager),它根本不会触发Adapter的任何回调方法,包括getItemCount()。你可以检查Fragment的onCreateView里,初始化RecyclerView时有没有类似代码:recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));(Kotlin写法:
recyclerView.layoutManager = LinearLayoutManager(context))数据更新时必须主动通知Adapter
初始数据为空时,给Adapter传入空集合(而非null),当Loader加载完数据后,一定要调用Adapter的通知方法——比如notifyDataSetChanged(),或者更高效的notifyItemRangeInserted()等。如果只修改了Adapter的数据源但没通知,RecyclerView完全不知道数据变化,自然不会调用getItemCount()。举个Adapter的示例(Java):
public class NewsAdapter extends RecyclerView.Adapter<NewsViewHolder> { private List<News> mNewsList; // 构造方法传入初始空列表 public NewsAdapter() { mNewsList = new ArrayList<>(); } // 更新数据的方法 public void updateNewsList(List<News> newList) { mNewsList.clear(); mNewsList.addAll(newList); notifyDataSetChanged(); // 关键:通知RecyclerView数据已更新 } @Override public int getItemCount() { return mNewsList.size(); } // 其他ViewHolder相关方法... }然后在Loader的
onLoadFinished回调里调用adapter.updateNewsList(data),注意要确保在主线程执行这个操作——如果Loader的回调在子线程,要用getActivity().runOnUiThread()包裹。检查RecyclerView与Adapter的绑定时机
确认你是在Fragment的onCreateView里完成RecyclerView的初始化和Adapter绑定的,而非更早的生命周期方法(比如onCreate)。因为此时视图还未创建,RecyclerView可能还没附加到视图树,导致Adapter的方法无法触发。排查NewsEntryFragment创建的影响
如果加载完数据后创建了新的NewsEntryFragment,要确保当前Fragment的RecyclerView没有被意外销毁或detached。比如如果用replace方式替换Fragment,当前Fragment的视图会被销毁,那RecyclerView自然不会再触发任何方法。如果要保留当前Fragment的RecyclerView,应该用add方式并处理好Fragment的显示隐藏。
内容的提问来源于stack exchange,提问作者Bjonic

