在片段中设置RecyclerView

时间:2019-10-04 15:58:25

标签: android kotlin android-recyclerview

我正在尝试将RecyclerView添加到片段,但是遇到了问题。

我的代码当前在我的代码的第44行上抛出“ java.lang.IllegalStateException:不得为null”。

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 :(得分:0)

使用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()
}

希望它对您有帮助。 快乐编码

答案 1 :(得分:0)

可能未附加活动(即上下文)。尝试在

中进行
override fun onActivityCreated(savedInstanceState: Bundle?) {}

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

也不要像参数那样使用非null的断言!

尝试使用:

        requireView()
        requireActivity()
        requireArguments()
        requireContext()

答案 2 :(得分:0)

这是我在片段中设置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
        }