我正在尝试将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
}
}
答案 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
}