2
votes

Configuration de RecyclerView dans Fragment

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>


2 commentaires

Vous ne pouvez pas référencer les vues avant leur création. Déplacez votre logique d'initialisation recyclerView vers la méthode onViewCreated () .


initRecyclerView () doit être dans onViewCreated


3 Réponses :


0
votes

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


2 commentaires

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/...



1
votes

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?) {}


0 commentaires

0
votes

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)
    }


0 commentaires