You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:07:41