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

无法将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)
    }
}

关键修复点说明

  1. 先加载布局再获取控件:必须先执行inflater.inflate得到view实例,再通过该view调用findViewById,才能正确获取到RecyclerView。
  2. 使用LinkedHashMap:替代HashMap保证数据插入顺序与显示顺序一致,避免无序导致的显示混乱。
  3. Adapter中转为List存储:避免每次调用keys/values.toTypedArray()的性能损耗,同时更安全地按位置访问数据。
  4. 正确返回数据数量:getItemCount返回实际数据条数,让RecyclerView知道需要渲染多少项。

内容的提问来源于stack exchange,提问作者asdwq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:24:20