I am trying to get List of States through Retrofit and trying to add in Searchable Spinner.
What I get :
I am getting List of States in Response.
I can access one state in Spinner.
What i want :
I want to access multiple States in Spinner.
Code :
getMainApp().electAPI.getStates().enqueue(object : Callback<Responseval>{
override fun onFailure(call: Call<Responseval>, t: Throwable) {
Toast.makeText(this@MainActivity, t?.message, Toast.LENGTH_SHORT)
}
override fun onResponse(call: Call<Responseval>, response: Response<Responseval>) {
if (response.isSuccessful!!){
val states = response.body()?.data
val stateArray = arrayListOf<String>(states?.get(0)!!.name)// Problem occur here i need to put value to get state
val spinner = findViewById<Spinner>(R.id.spinner)
val adapter = ArrayAdapter<String>(this@MainActivity, android.R.layout.simple_spinner_item, stateArray)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter
val options = stateArray
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
Toast.makeText(this@MainActivity, " You select >> "+options[position], Toast.LENGTH_SHORT).show();
}
override fun onNothingSelected(parent: AdapterView<*>) {
// sometimes you need nothing here
}
}
}
}
})
Pokos :
data class Responseval(val `data`: List<Data>, val message: String, val success: Boolean)
data class Data(val created_at: String, val id: Int, val name: String, val status: Int, val updated_at: String)
You can use a loop like this.
getMainApp().electAPI.getStates().enqueue(object : Callback<Responseval>{
override fun onFailure(call: Call<Responseval>, t: Throwable) {
Toast.makeText(this@MainActivity, t?.message, Toast.LENGTH_SHORT)
}
override fun onResponse(call: Call<Responseval>, response: Response<Responseval>) {
if (response.isSuccessful!!){
val states = response.body()?.data
var stateArray = arrayListOf<String>
for(i = 0; i<response.body.data.size; i++){
stateArray.add(response.body.data.get(i).name)
}
val spinner = findViewById<Spinner>(R.id.spinner)
val adapter = ArrayAdapter<String>(this@MainActivity, android.R.layout.simple_spinner_item, stateArray)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter
val options = stateArray
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
Toast.makeText(this@MainActivity, " You select >> "+options[position], Toast.LENGTH_SHORT).show();
}
override fun onNothingSelected(parent: AdapterView<*>) {
// sometimes you need nothing here
}
}
}
}
})
for loop in kotlin
for (i in 0..(response.body.data.size-1)) {
stateArray.add(response.body.data.get(i).name)
}
getMainApp().electAPI.getStates().enqueue(object : Callback<Responseval>{
override fun onFailure(call: Call<Responseval>, t: Throwable) {
Toast.makeText(this@MainActivity, t?.message, Toast.LENGTH_SHORT)
}
override fun onResponse(call: Call<Responseval>, response: Response<Responseval>) {
if (response.isSuccessful!!){
val states = response.body()?.data
val stateArray = Array<String>(states.size())
for(int i=0;i<sates.size();i++)
{
stateArray[i]=sates.get(i).name;
if(i == (sates.size() -1) )
{
val spinner = findViewById<Spinner>(R.id.spinner)
val adapter = ArrayAdapter<String>(this@MainActivity, android.R.layout.simple_spinner_item, stateArray)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter
val options = stateArray
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
Toast.makeText(this@MainActivity, " You select >> "+options[position], Toast.LENGTH_SHORT).show();
}
override fun onNothingSelected(parent: AdapterView<*>) {
// sometimes you need nothing here
}
}
}
}
}
}
})
You are just accessing the first position on the list that's why spinner is displaying only one option.
Happy Coding...
This method will make it short add items in array
getMainApp().electAPI.getStates().enqueue(object : Callback<Responseval>{
override fun onFailure(call: Call<Responseval>, t: Throwable) {
Toast.makeText(this@MainActivity, t?.message, Toast.LENGTH_SHORT)
}
override fun onResponse(call: Call<Responseval>, response: Response<Responseval>) {
if (response.isSuccessful!!){
val states = response.body()?.data
var stateArray = arrayListOf<String>
for(state in states){
stateArray.add(states.get(i).name)
}
val spinner = findViewById<Spinner>(R.id.spinner)
val adapter = ArrayAdapter<String>(this@MainActivity, android.R.layout.simple_spinner_item, stateArray)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.adapter = adapter
val options = stateArray
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
Toast.makeText(this@MainActivity, " You select >> "+options[position], Toast.LENGTH_SHORT).show();
}
override fun onNothingSelected(parent: AdapterView<*>) {
// sometimes you need nothing here
}
}
}
}
})
来源:https://stackoverflow.com/questions/55530327/issue-with-retrofit-response