Search code examples
kotlinandroid-volleyspinner

Why does my spinner not displaying selected item


I have a spinner in my activity that gets its data from a volley call. The data shows in the spinner. But when I click on a specific item in the spinner it does show.

Spinner Code

private fun spinner() {

    val spinner = findViewById<Spinner>(R.id.report2Spinner)
    if (spinner != null) {
        val arrayAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, companyList)
        spinner.adapter = arrayAdapter
        spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                selectedItem = spinner.getItemAtPosition(position).toString()
                Toast.makeText(this@Report2Activity, selectedItem, Toast.LENGTH_SHORT).show()
                spinner.setSelection(position)
            }

            override fun onNothingSelected(parent: AdapterView<*>) {

            }
        }
    }
}

declare of array that holds the volley data

var companyList: ArrayList = ArrayList()

Volley call

private fun jsonGetCompany() {
    //Declaring URL for JSON file
    val url = "https://mist.zp.co.za:6502/MIST.svc/CMP/M@H\$@203@R"

    val request = JsonObjectRequest(
            Request.Method.GET, url, null,
            { response ->
                try {
                    val jsonArray = response.getJSONArray("Table")
                    for (i in 0 until jsonArray.length()) {
                        //Adding variables to JSONArray
                        val item = jsonArray.getJSONObject(i)
                        companyList.add(item.getString("Company"))
                    }
                } catch (e: JSONException) {
                    e.printStackTrace()
                }
            }, { error -> error.printStackTrace() })
    //Adding request to the queue
    requestQueue?.add(request)
    //Setting timeout and retries
    request.retryPolicy = DefaultRetryPolicy(30000, 3, 1f)
}

Before choosing While Choosing After Choosing

Here is the onCreate where I call spinner() and jsonGetCompany()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_report2)
    title = "Report 2"


    //Initialising Recyclerview
    recyclerViewReport2 = findViewById(R.id.recyclerViewReport2)
    val linearLayoutManager = LinearLayoutManager(applicationContext)
    recyclerViewReport2.layoutManager = linearLayoutManager

    //Declaring Volley requestQueue for JSON calls
    requestQueue = Volley.newRequestQueue(this)

    //Using JSON request function
    jsonGetCompany()
    spinner()

    val fromDatePicker: DatePicker = findViewById(R.id.report2FromDatePicker)
    val endDatePicker: DatePicker = findViewById(R.id.report2EndDatePicker)

    val buttonLoad: Button = findViewById(R.id.buttonLoad)
    buttonLoad.setOnClickListener {
        fromDate = "${fromDatePicker.year}-${fromDatePicker.month + 1}-${fromDatePicker.dayOfMonth}"
        endDate = "${endDatePicker.year}-${endDatePicker.month + 1}-${endDatePicker.dayOfMonth}"
        Toast.makeText(this, "Company is: $selectedItem",       Toast.LENGTH_SHORT).show()
        jsonRequestReport2Data()

        if (recyclerViewReport2.isNotEmpty()) {
            company.clear()
            report2Adapter.notifyDataSetChanged()
        }
    }
 }

Solution

  • Edit : Its because jsonGetCompany() and spinner() is called same time but volley works asynchronously. You should set adapter after volley gets data from server. Calling this server call from activity is not proper way but it's completely different subject. You can simply edit your code like :

     try {
          val jsonArray = response.getJSONArray("Table")
          for (i in 0 until jsonArray.length()) {
          //Adding variables to JSONArray
               val item = jsonArray.getJSONObject(i)
               companyList.add(item.getString("Company"))
          }
          setSpinner()
     } catch (e: JSONException) {
         e.printStackTrace()
     }
    

    Glad i could help.