无法将Adapter绑定到RecyclerView?持续报错“No adapter attached; skipping layout”
问题原因与修复方案
核心问题
你收到W/RecyclerView: No adapter attached; skipping layout警告的根本原因是:在onCreateView中,你尝试通过view?.findViewById获取RecyclerView时,view还未被初始化——此时你还没执行inflater.inflate加载布局,view是null,导致mRecyclerView始终为null,Adapter根本没绑定到RecyclerView上。
除此之外,你的Adapter还存在两个小问题:
getItemCount固定返回1,但你的数据有2条,会导致只显示一条数据- HashMap是无序集合,直接通过
keys.toTypedArray()[position]获取数据会导致显示顺序不可控
修复后的代码
Fragment类
class Latest : Fragment() { private lateinit var mRecyclerView: RecyclerView private lateinit var mAdapter: CurrencyAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // 先加载布局得到view实例 val view = inflater.inflate(R.layout.fragment_latest, container, false) // 用LinkedHashMap保证数据顺序 val currencyMap = LinkedHashMap<String, Double>() currencyMap["asd"] = 1.2 currencyMap["as2d"] = 3.2 Log.i(TAG, "onCreateView: ${currencyMap.keys} ${currencyMap.values}") // 通过已加载的view获取RecyclerView mRecyclerView = view.findViewById(R.id.latest_rv) mRecyclerView.layoutManager = LinearLayoutManager(context) mAdapter = CurrencyAdapter(currencyMap) mRecyclerView.adapter = mAdapter return view } }
Adapter类
class CurrencyAdapter(private val data: LinkedHashMap<String, Double>) : RecyclerView.Adapter<CurrencyAdapter.ViewHolder>() { // 将Map的键值对转为List,方便安全按位置获取数据 private val currencyList = data.entries.toList() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.currency_row, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val entry = currencyList[position] holder.currencyOrigin.text = entry.key holder.currencyValue.text = entry.value.toString() } override fun getItemCount(): Int { // 返回实际数据条数 return currencyList.size } class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val currencyOrigin: TextView = itemView.findViewById(R.id.currency_origin) val currencyValue: TextView = itemView.findViewById(R.id.currency_value) } }
关键修复点说明
- 先加载布局再获取控件:必须先执行
inflater.inflate得到view实例,再通过该view调用findViewById,才能正确获取到RecyclerView。 - 使用LinkedHashMap:替代HashMap保证数据插入顺序与显示顺序一致,避免无序导致的显示混乱。
- Adapter中转为List存储:避免每次调用
keys/values.toTypedArray()的性能损耗,同时更安全地按位置访问数据。 - 正确返回数据数量:
getItemCount返回实际数据条数,让RecyclerView知道需要渲染多少项。
内容的提问来源于stack exchange,提问作者asdwq
相关产品推荐
相关产品推荐

