J'essaie d'ajouter un RecyclerView à un fragment, mais je rencontre un problème.
Mon code lance actuellement "java.lang.IllegalStateException: cela ne doit pas être nul" à la ligne 44 de mon code , qui est:
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
}
}
Comment référencer correctement mon RecyclerView, afin de pouvoir l'initialiser avec des données?
layoutManager = LinearLayoutManager(this.context)
p>
3 Réponses :
Utilisez activity au lieu de this.context comme le suivant
// populate the views now that the layout has been inflated
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initRecyclerView()
addToppingList()
}
Et appelez initRecyclerView () de l'intérieur de onViewCreated au lieu de onCreate comme suit
toppingRecyclerView.apply {
layoutManager = LinearLayoutManager(activity)
adapter = toppingAdapter
}
J'espère que cela vous aidera. Codage heureux
J'obtiens maintenant l'erreur suivante: java.lang.NullPointerException: Tentative d'appeler la méthode virtuelle 'boolean androidx.recyclerview.widget.RecyclerView $ ViewHolder.shouldI gnore ()' sur une référence d'objet nulle
@RyanMoeller pour votre nouveau problème, consultez cette stackoverflow.com/questions/35786072/...
L'activité, qui est le contexte, n'est probablement pas jointe. Essayez de le faire dans
requireView()
requireActivity()
requireArguments()
requireContext()
ou
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {}
N'utilisez pas non plus d'assertions non nulles comme des arguments !!
essayez d'utiliser:
override fun onActivityCreated(savedInstanceState: Bundle?) {}
Voici comment je configure mon recycleView dans mes fragments
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
}
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)
}
Vous ne pouvez pas référencer les vues avant leur création. Déplacez votre logique d'initialisation
recyclerViewvers la méthodeonViewCreated ().initRecyclerView () doit être dans onViewCreated