RecyclerView报‘no attached adapter skipping layout’错误,求排查解决
解决RecyclerView "no attached adapter skipping layout" 错误
我帮你梳理下代码里的几个关键问题,这些问题共同导致了这个警告甚至可能引发运行异常:
1. 提前初始化Adapter,避免布局阶段无Adapter绑定
网络请求是异步操作,你的RecyclerView在onCreate完成布局测量时,Adapter还没被设置(要等网络回调返回才创建),所以系统会抛出这个警告。正确的做法是先给RecyclerView绑定一个空Adapter,后续再更新数据:
修改PilihBusActivity的onCreate方法:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pilih_bus); mRecycler = (RecyclerView) findViewById(R.id.recyclerView1); mManager = new LinearLayoutManager(this); mRecycler.setLayoutManager(mManager); mRecycler.setHasFixedSize(true); // 先初始化空列表和Adapter,提前绑定到RecyclerView mItems = new ArrayList<>(); mAdapter = new BusAdapter(PilihBusActivity.this, mItems); mRecycler.setAdapter(mAdapter); api = ApiClient.getApiClient().create(ApiBus.class); Call<ResponseModel> getdata = api.getBus(); getdata.enqueue(new Callback<ResponseModel>() { @Override public void onResponse(Call<ResponseModel> call, Response<ResponseModel> response) { if (response.isSuccessful() && response.body() != null) { Log.d("RETROFIT", "RESPONSE : " + response.body().getmKode()); // 使用Adapter的setmList方法更新数据,无需重新创建Adapter mItems = response.body().getResult(); mAdapter.setmList(mItems); } } @Override public void onFailure(Call<ResponseModel> call, Throwable t) { Log.d("RETROFIT", "FAILED : respon gagal", t); // 打印完整异常信息,方便排查问题 } }); }
2. 修复Adapter中加载错误的布局文件
你的BusAdapter的onCreateViewHolder方法里,错误地加载了Activity的布局R.layout.activity_pilih_bus,这应该替换为RecyclerView的单个条目布局(比如你自定义的R.layout.item_bus,里面包含class_name、price等控件):
@NonNull @Override public BusAdapter.ViewHolders onCreateViewHolder( ViewGroup parent, int viewType) { // 替换成你的RecyclerView条目布局ID View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_bus, parent, false); ViewHolders holder = new ViewHolders(layout); return holder; }
如果还没有专门的条目布局,你需要创建一个单独的布局文件,用来展示单个Bus的UI,不能复用Activity的布局文件。
3. 处理空数据的边界情况
为了避免网络请求失败或返回数据为空时出现空指针异常,建议在BusAdapter的getItemCount方法里做空判断:
@Override public int getItemCount() { return buses != null ? buses.size() : 0; }
同时在onResponse里也要判断response.body()和response.body().getResult()是否为空,防止空指针崩溃。
做完这几点修改后,"no attached adapter skipping layout"的警告应该就会消失,RecyclerView也能正常加载数据了。
内容的提问来源于stack exchange,提问作者Niffari Meirina Bernova
相关产品推荐
相关产品推荐

