Android 5.1设备Fragment中RecyclerView不显示的问题解决
解决Android 5.1设备上RecyclerView“no adapter attached”且不显示列表项的问题
我之前也踩过Android 5.1设备的这个RecyclerView坑,模拟器正常但实体机出问题,核心原因是RecyclerView在首次布局绘制时还没有关联Adapter,Android 5.1的系统对这个状态的处理比高版本更严格,导致后续即使设置了Adapter也可能不触发重新布局,同时输出“skip layout no adapter attached”的日志。给你几个针对性的解决步骤:
1. 提前初始化空Adapter,避免布局时无Adapter关联
你现在是在网络请求成功后才创建并设置Adapter,但网络请求是异步的,RecyclerView会先完成首次布局,这时候没有Adapter就会触发警告。正确的做法是在设置LayoutManager之后,立刻初始化一个空数据的Adapter并绑定到RecyclerView:
recyclerView = (RecyclerView)view.findViewById(R.id.newsList); recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); // 提前初始化空列表和Adapter,绑定到RecyclerView articleList = new ArrayList<>(); newsRecyclerAdapter = new NewsRecyclerAdapter(getContext(), articleList); recyclerView.setAdapter(newsRecyclerAdapter); // 之后再发起网络请求 ArticleService articleService = ServiceGenerator.createService(ArticleService.class); articleService.getLatestNewsHeadlines(CONSTANTS.COUNTRY_US, CONSTANTS.CATEGORY_BUSINESS, CONSTANTS.API_KEY) .enqueue(new Callback<NewsDataModel>() { @SuppressLint("WrongConstant") @Override public void onResponse(Call<NewsDataModel> call, Response<NewsDataModel> response) { // 先判断请求是否成功,避免空指针崩溃 if (response.isSuccessful() && response.body() != null && response.body().getArticles() != null) { // 更新列表数据并通知Adapter刷新 articleList.clear(); articleList.addAll(response.body().getArticles()); newsRecyclerAdapter.notifyDataSetChanged(); } } @Override public void onFailure(Call<NewsDataModel> call, Throwable t) { Toast.makeText(getContext(), "There was some error"+t.toString(), Toast.LENGTH_SHORT).show(); Log.e("Error",t.toString()); } });
这样RecyclerView在首次布局时就有Adapter关联,不会再输出警告,后续数据加载完成后,通过notifyDataSetChanged()就能让列表正常显示数据。
2. 检查Adapter实现是否兼容Android 5.1
Android 5.1对应的API级别是22,确保你的NewsRecyclerAdapter里没有使用API22及以下不支持的特性,比如Lambda表达式(如果用了的话需要通过Retrolambda或者AndroidX兼容库处理)、某些新的View原生方法(建议用ViewCompat替代以保证兼容性)。
3. 确认网络权限和设备网络状态
- 确保你的
AndroidManifest.xml中已经添加了网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
- 检查实体设备是否正常连接网络,避免因为网络问题导致请求失败,列表始终为空。
内容的提问来源于stack exchange,提问作者Abhishek Pathak
相关产品推荐
相关产品推荐

