【问题标题】:E/RecyclerView: No adapter attached skipping layoutE/RecyclerView:没有附加适配器跳过布局
【发布时间】:2019-09-26 17:30:02
【问题描述】:

我对@9​​87654322@ 中的RecyclerView 有疑问。在MainActivity 我有一个TabLayout 和一个ViewPager。我想在我的第一个标签中显示RecyclerView,但我不断收到以下错误:

E/RecyclerView:没有附加适配器;跳过布局

我尝试将回收器适配器初始化移动到OnViewCreated,但没有结果。

这是我的片段代码:

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        listOfGreetings?.add(0, GreetingModel("Greeting 1", R.drawable.ic_launcher_background))
        listOfGreetings?.add(1, GreetingModel("Greeting 2", R.drawable.greeting_1))
        listOfGreetings?.add(2, GreetingModel("Greeting 3", R.drawable.greeting_1))
        listOfGreetings?.add(3, GreetingModel("Greeting 4", R.drawable.greeting_1))
        listOfGreetings?.add(4, GreetingModel("Greeting 5", R.drawable.greeting_1))
        listOfGreetings?.add(5, GreetingModel("Greeting 6", R.drawable.greeting_1))
        listOfGreetings?.add(6, GreetingModel("Greeting 7", R.drawable.greeting_1))
        listOfGreetings?.add(7, GreetingModel("Greeting 8", R.drawable.greeting_1))


        val recyclerView = container?.findViewById<RecyclerView>(R.id.recyclerView)
        val manager = LinearLayoutManager(activity)



        recyclerView?.setHasFixedSize(true)
        recyclerView?.layoutManager = manager



        recyclerView?.adapter = greetingAdapter

        return inflater.inflate(R.layout.fragment_category, container, false)

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        greetingAdapter = GreetingAdapter(activity!!, listOfGreetings!!.toList())
    }

这是 XML:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"
             tools:context=".CategoryFragment">

    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="3dp"
            />

</FrameLayout>

【问题讨论】:

  • 在使用onViewCreated()view.findViewById()时是否仍然报错?
  • 使用 onViewCreated() 扩展依赖于根视图的视图。
  • @TaseerAhmad 是的。它仍然给出错误,没有结果((
  • @MartinMarconcini 我已经在 onViewCreated 上移动了我的回收器视图初始化,但它没有帮助(覆盖 fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val recyclerView = view.findViewById(R.id.recyclerView) val manager = LinearLayoutManager(activity) recyclerView?.setHasFixedSize(true) recyclerView?.layoutManager = manager recyclerView?.adapter = greetingAdapter greetingAdapter = GreetingAdapter(activity!!, listOfGreetings! !.toList()) }
  • 错误告诉你你的 RecyclerView,在布局传递时,没有适配器(还),所以它的布局传递将被跳过(因为没有适配器的 RecyclerView 基本上是没用的);尝试将recyclerView?.adapter = greetingAdapter 行移到您获得参考的下方。还要发布您的适配器,如果我们看不到它,就很难判断适配器是否工作正常;)

标签: kotlin android-recyclerview


【解决方案1】:

您看到此错误消息是因为recyclerView?.adapter = greetingAdapter 中的安全调用?. 将返回null,因此它不会被执行,因为您在视图膨胀之前调用它,即inflater.inflate(R.layout.fragment_category, container, false),所以要解决那: 创建一个具有膨胀视图的值的变量,然后使用它从中获取视图并返回它就像这样:


override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {


listOfGreetings?.add(0, GreetingModel("Greeting 1", R.drawable.ic_launcher_background))
        listOfGreetings?.add(1, GreetingModel("Greeting 2", R.drawable.greeting_1))
        listOfGreetings?.add(2, GreetingModel("Greeting 3", R.drawable.greeting_1))
        listOfGreetings?.add(3, GreetingModel("Greeting 4", R.drawable.greeting_1))
        listOfGreetings?.add(4, GreetingModel("Greeting 5", R.drawable.greeting_1))
        listOfGreetings?.add(5, GreetingModel("Greeting 6", R.drawable.greeting_1))
        listOfGreetings?.add(6, GreetingModel("Greeting 7", R.drawable.greeting_1))
        listOfGreetings?.add(7, GreetingModel("Greeting 8", R.drawable.greeting_1))


 //This varaible will holds a reference to the inflated view.
 val view = inflater.inflate(R.layout.fragment_category, container, false)

 //Get the recyclerView from the inflated view.
 val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
 val manager = LinearLayoutManager(activity)

 //No need to the safe call ?. here because recyclerView won't be null. 
 recyclerView.setHasFixedSize(true)
 recyclerView.layoutManager = manager
 recyclerView.adapter = greetingAdapter

 return view 
}

此外,您在代码中过度使用了安全调用运算符 ?.listGreetings 可以变得更简单,您可以在 listGreeting 的对象上使用 apply(),在我们的例子中使用安全调用:

listOfGreetings?.apply {
            add(0, GreetingModel("Greeting 1", R.drawable.ic_launcher_background))
            add(1, GreetingModel("Greeting 2", R.drawable.greeting_1))
            add(2, GreetingModel("Greeting 3", R.drawable.greeting_1))
            add(3, GreetingModel("Greeting 4", R.drawable.greeting_1))
            add(4, GreetingModel("Greeting 5", R.drawable.greeting_1))
            add(5, GreetingModel("Greeting 6", R.drawable.greeting_1))
            add(6, GreetingModel("Greeting 7", R.drawable.greeting_1))
            add(7, GreetingModel("Greeting 8", R.drawable.greeting_1))
 }

这将检查如果listGreetings 不等于null,则将执行apply 块中的代码:

apply{
//block
}

【讨论】:

  • 另外,请注意,kotlin 提供了一种从膨胀布局中获取特定视图的更简单方法,因此您可以直接执行以下view.recyclerView 而无需调用view.findViewById()
  • 非常感谢:) 你的代码有效)只有我在 onCreatedView 方法上移动了 greetingAdapter = GreetingAdapter(activity!!, listOfGreetings!!.toList())
  • 很高兴它对您有用,如果您觉得它有用,可以通过单击答案开头的复选来接受我的回答。
  • 我想接受答案,但不幸的是我的声誉低于 15 ((我是 stackoverflow 的新手。感谢您的帮助:)
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多