E / RecyclerView: адаптер не подключен, пропускающий макет - PullRequest
0 голосов
/ 26 сентября 2019

У меня проблема с RecyclerView в FragmentMainActivity у меня есть 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>

1 Ответ

0 голосов
/ 26 сентября 2019

Вы видите это сообщение об ошибке, потому что безопасный вызов ?. в recyclerView?.adapter = greetingAdapter вернет ноль, поэтому он не будет выполнен, потому что вы вызываете его до того, как представление завышено, что составляет 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 можно сделать намного проще, вы можете использовать apply() для объекта, который в нашем случае listGreeting с безопасным вызовом:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...