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