'Struggling to access Spinner outside of my recycler view

I have tried two different ways to access my spinner. Without success thus far. I want to load the data for each driver as chosen.

To give an idea of my app. My app

Code for adapter:



class TableViewAdapter(var tripsheetlist: Tripsheetlist) : RecyclerView.Adapter<TableViewAdapter.RowViewHolder>() {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RowViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.table_list_item, parent, false)
        return RowViewHolder(itemView) }

    override fun getItemCount(): Int { return tripsheetlist.videos.size + 1 // one more to add header row
    }

    override fun onBindViewHolder(holder: RowViewHolder, position: Int) {

        val rowPos = holder.adapterPosition


        if (rowPos == 0) {
            // Header Cells. Main Headings appear here
            holder.itemView.apply {
                setHeaderBg(txtWOrder)
                setHeaderBg(txtDElNote)
                setHeaderBg(txtCompany)
              //  setHeaderBg(txtAddress)
                setHeaderBg(txtWeight)
               setHeaderBg(txtbutton1)
                setHeaderBg(txtbutton2)
                setHeaderBg(txttvdone)

                txtWOrder.text = "WOrder"
                txtDElNote.text = "DElNote"
                txtCompany.text = "Company"
               // txtAddress.text = "Address"
                txtWeight.text = "Weight"
                txtbutton1.text = "Delivered"
                txtbutton2.text = "Exception"
                txttvdone.text = ""
            }
        } else {
            val modal = tripsheetlist.videos[rowPos -1]

            holder.itemView.apply {
                setContentBg(txtWOrder)
                setContentBg(txtDElNote)
                setContentBg(txtCompany)
                setContentBg(txtWeight)
                setContentBg(txtbutton1)
                setContentBg(txtbutton2)
                setContentBg(txttvdone)

                val list : MutableList<String> = ArrayList()
                list.add("Deon")
                list.add("Leon")
                list.add("David")
                list.add("Dick")
                println(list)
                val spinner : Spinner = findViewById(R.id.spnDriver)


                spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
                    override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
                        val item :String = list[p2]


                        if (item == "David")

                        {
                            txtWOrder.text = modal.WOrder.toString()
                            txtDElNote.text = modal.DElNote.toString()
                            txtCompany.text = modal.name.toString()
                            txtWeight.text = modal.id.toString()
                        }
                    }

                    override fun onNothingSelected(p0: AdapterView<*>?) {
                    }
                }




I did it like this as a test for now. As I will get the drivers from my JSON. I don't have access to it yet so that is why the static values. The problem I am getting now is: findViewById(R.id.spnDriver) must not be null

I first had my spinner class in my main activity and passed it over like this:


        val list : MutableList<String> = ArrayList()
        list.add("Deon")
        list.add("Leon")
        list.add("David")
        list.add("Dick")
        list.add("Jim")
        list.add("Harry")
        val adapter = ArrayAdapter( this, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item, list)
        val spinner: Spinner = findViewById(R.id.spnDriver)
        spinner.adapter = adapter
        spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
                val item :String = list[p2]
                Toast.makeText(this@MainActivity, "Driver $item selected", Toast.LENGTH_SHORT).show()
            }

            override fun onNothingSelected(p0: AdapterView<*>?) {
                //empty
            }

          //  insert code that activates data pull of tripsheet for driver= actifavte by method the class/object that activates the data pull. so datapuul(Driver)
                }
        limitDropDownHeight(spinner)
 //drivers end


        val btnLoadData: Button = findViewById(R.id.btnLoadData)



//        weightsum(tvTotalweight, Tripsheetlist)
//        totaldelNotes(tvTotaldelv,Tripsheetlist)
     //   setData(btnLoadData, Tripsheetlist )

        fetchJson(spinner)

    }

    private fun fetchJson(spinner: Spinner) {

        println("Attempting to Fetch JSON")

        val url = "https://api.letsbuildthatapp.com/youtube/home_feed"

        val request = Request.Builder().url(url).build()

        val client = OkHttpClient()
        client.newCall(request).enqueue(object: Callback {


            override fun onFailure(call: Call, e: IOException) {
                println("Failed to execute request")            }

            override fun onResponse(call: Call, response: Response) {
                val body = response.body?.string()
                println(body)

                val gson = GsonBuilder().create()

                val tripsheetlist = gson.fromJson(body, Tripsheetlist::class.java)

                runOnUiThread {
                    recyclerViewTripsheetlist.adapter = TableViewAdapter(tripsheetlist, spinner)
                }
            }
        })
    } 

In my Adapter class I then called it with : val spinner = spnDriver This led to a different error: AppCompatSpinner.setOnItemSelectedListener(android.widget.AdapterView$OnItemSelectedListener)' on a null object reference But seems like it passed the val spinner =spnDriver without a problem.

Thank you for all input and help.



Solution 1:[1]

I found a solution. What I did was to keep the spinner inside my MainActivity and then just pass the result of the spinner to the adapter - where I wanted to use it.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 helpVulcan