Настройка RecyclerView во фрагменте - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь добавить RecyclerView к фрагменту, но у меня возникла проблема.

Мой код в настоящее время выдает «java.lang.IllegalStateException: это не должно быть нулевым» в строке 44моего кода:

layoutManager = LinearLayoutManager(this.context)

Как правильно ссылаться на мой RecyclerView, чтобы я мог инициализировать его с данными?

package com.example.subshop

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_receipt.*
import kotlinx.android.synthetic.main.fragment_receipt.view.*
import kotlinx.android.synthetic.main.fragment_receipt.view.toppingRecyclerView

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

class ReceiptFragment : Fragment() {

    private lateinit var toppingAdapter: ToppingAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        initRecyclerView()
        addToppingList()
    }

    private fun initRecyclerView() {

        toppingAdapter = ToppingAdapter()

        toppingRecyclerView.apply {
            layoutManager = LinearLayoutManager(this.context)
            adapter = toppingAdapter
        }
    }

    private fun addToppingList() {
        toppingAdapter.submitList(ReceiptFragmentArgs.fromBundle(arguments!!).sandwich.toppings)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_receipt, container, false)
        val sandwich = ReceiptFragmentArgs.fromBundle(arguments!!).sandwich

        view.sandwichAndBreadText.text = "${sandwich.name} on ${sandwich.breadName}"
        view.totalText.text = "Total: \$${sandwich.basePrice + sandwich.toppingPrice}"

        view.doneButton.setOnClickListener {
            findNavController().navigate(ReceiptFragmentDirections.actionReceiptFragmentToWelcomeFragment())
        }

        return view
    }
}

Ответы [ 3 ]

0 голосов
/ 04 октября 2019

Вероятно, действие, которое является контекстом, не прикреплено. Попробуйте сделать это в

override fun onActivityCreated(savedInstanceState: Bundle?) {}

или

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {}

Также не используйте ненулевые утверждения как аргументы !!

попробуйте использовать:

        requireView()
        requireActivity()
        requireArguments()
        requireContext()
0 голосов
/ 04 октября 2019

Вот так я настраиваю свой recycleView в своих фрагментах

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        viewManager = LinearLayoutManager(activity)
        viewAdapter = MyAdapter(requireContext())

        return inflater.inflate(R.layout.my_fragment, container, false)
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // Setup recycler view
        recyclerView = my_recycler_view.apply {
            setHasFixedSize(true)

            layoutManager = viewManager

            // specify an viewAdapter (see also next example)
            adapter = viewAdapter
        }
0 голосов
/ 04 октября 2019

Используйте activity вместо this.context, как показано ниже

  toppingRecyclerView.apply {
         layoutManager = LinearLayoutManager(activity)
         adapter = toppingAdapter
  }

И позвоните initRecyclerView() изнутри onViewCreated вместо onCreate, как показано ниже

// populate the views now that the layout has been inflated
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
     super.onViewCreated(view, savedInstanceState)

     initRecyclerView()
     addToppingList()
}

Надеюсь, это поможет вам. Счастливое кодирование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...