JSON Parsing problema con Spinners

Todos mis hilanderos están conectados entre sí, no son independientes, me gustaría mostrar opciones en spinner2 y spinner3 basado en la selección en spinner1 (me refiero a la categoría elegida por el usuario en spinner1)

En onCreate estoy poblando datos en Spinners, pero en spinner2 y spinner3 estoy recibiendo datos que pertenecen a la categoría B, mientras que deben rellenar sólo con los datos de la categoría A.

Entonces, ¿dónde está mi error? Aquí está mi código JSON Parsing:

  categoryArrayList = new ArrayList<Category>(); cArrayList = new ArrayList<String>(); ................................... // Array Level 1 --- START JSONArray jarray = jsono.getJSONArray("categories"); for (int i = 0; i < jarray.length(); i++) { JSONObject object = jarray.getJSONObject(i); Category language = new Category(); language.setName(object.getString("category_name")); Log.d("category_name::-", object.getString("category_name")); language.setTypeArrayList(typeArrayList); categoryArrayList.add(language); cArrayList.add(categoryArrayList.get(i).getName()); // Array Level 1 --- END // Array Level 2 --- START JSONArray jsarray = object.getJSONArray("types"); typeArrayList = new ArrayList<Type>(); tArrayList = new ArrayList<String>(); for (int j = 0; j < jsarray.length(); j++) { JSONObject jjobject = jsarray.getJSONObject(j); Type genre = new Type(); genre.setName(jjobject.getString("type_name")); Log.d("type_name::-", jjobject.getString("type_name")); genre.setServiceArrayList(serviceArrayList); typeArrayList.add(genre); tArrayList.add(typeArrayList.get(j).getName()); // Array Level 2 --- END // Array Level 3 --- START JSONArray jsonarray = jjobject.getJSONArray("services"); serviceArrayList = new ArrayList<Service>(); sArrayList = new ArrayList<String>(); for (int k = 0; k < jsonarray.length(); k++) { JSONObject jjjobject = jsonarray.getJSONObject(k); Service movie = new Service(); movie.setName(jjjobject.getString("service_name")); Log.d("service_name::-", jjjobject.getString("service_name")); serviceArrayList.add(movie); sArrayList.add(serviceArrayList.get(k).getName()); // Array Level 3 --- END } } } return true; } 

Y aquí es cómo estoy poblando Spinners:

  spinner1.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, cArrayList)); spinner2.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, tArrayList)); spinner3.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, sArrayList)); 

Oreo. Aquí está el código completo.

Clase de categoría

 public class Category { String name; ArrayList<ArrayList<Type>> type; Category() { name = ""; type = new ArrayList<ArrayList<Type>>(); } void setName(String s) { name =s; } public String getName() { return name; } void setTypeArrayList(ArrayList<Type> serviceArrayList) { type.add(serviceArrayList); } ArrayList<Type> getTypeArrayList(int i) { return type.get(i); } } 

Clase de tipo

 import java.util.ArrayList; public class Type { String type; ArrayList<ArrayList<Service>> service; public Type() { // TODO Auto-generated constructor stub type = ""; service = new ArrayList<ArrayList<Service>>(); } void setName(String s) { type =s; } public String getName() { return type; } void setServiceArrayList(ArrayList<Service> serviceArrayList) { service.add(serviceArrayList); } ArrayList<Service> getServiceArrayList(int i) { return service.get(i); } } 

Clase de servicio

 public class Service { String service; public Service() { // TODO Auto-generated constructor stub service =""; } void setName(String s) { service =s; } public String getName() { return service; } } 

Inicializar global

  int catpos =0; ArrayList<Category> categoryArrayList = new ArrayList<Category>(); ArrayList<String> cArrayList = new ArrayList<String>(); ArrayList<Type> typeArrayList; ArrayList<Service> serviceArrayList; 

Hacer un reto

  //your http request and response process JSONObject jsono; try { jsono = new JSONObject(data); JSONArray jarray = jsono.getJSONArray("categories"); for (int i = 0; i < jarray.length(); i++) { JSONObject object = jarray.getJSONObject(i); Category language = new Category(); language.setName(object.getString("category_name")); Log.d("category_name::-", object.getString("category_name")); JSONArray jsarray = object.getJSONArray("types"); typeArrayList = new ArrayList<Type>(); tArrayList = new ArrayList<String>(); for (int j = 0; j < jsarray.length(); j++) { JSONObject jjobject = jsarray.getJSONObject(j); Type genre = new Type(); genre.setName(jjobject.getString("type_name")); Log.d("type_name::-", jjobject.getString("type_name")); JSONArray jsonarray = jjobject.getJSONArray("services"); serviceArrayList = new ArrayList<Service>(); sArrayList = new ArrayList<String>(); for (int k = 0; k < jsonarray.length(); k++) { JSONObject jjjobject = jsonarray.getJSONObject(k); Service movie = new Service(); movie.setName(jjjobject.getString("service_name")); Log.d("service_name::-", jjjobject.getString("service_name")); serviceArrayList.add(movie); sArrayList.add(serviceArrayList.get(k).getName()); } genre.setServiceArrayList(serviceArrayList); typeArrayList.add(genre); tArrayList.add(typeArrayList.get(j).getName()); } language.setTypeArrayList(typeArrayList); categoryArrayList.add(language); cArrayList.add(categoryArrayList.get(i).getName()); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

OnPostExecute Método

  tArrayList = new ArrayList<String>(); sArrayList = new ArrayList<String>(); Category c = categoryArrayList.get(0); typeArrayList = c.getTypeArrayList(0); for(int i=0;i<typeArrayList.size();i++) tArrayList.add(typeArrayList.get(i).getName()); Type t = typeArrayList.get(0); serviceArrayList = t.getServiceArrayList(0); for(int i=0;i<serviceArrayList.size();i++) sArrayList.add(serviceArrayList.get(i).getName()); spinner1.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, cArrayList)); spinner2.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, tArrayList)); spinner3.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, sArrayList)); spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { catpos = pos; tArrayList = new ArrayList<String>(); sArrayList = new ArrayList<String>(); Category c = categoryArrayList.get(pos); typeArrayList = c.getTypeArrayList(0); for(int i=0;i<typeArrayList.size();i++) tArrayList.add(typeArrayList.get(i).getName()); Type t = typeArrayList.get(0); serviceArrayList = t.getServiceArrayList(0); for(int i=0;i<serviceArrayList.size();i++) sArrayList.add(serviceArrayList.get(i).getName()); spinner2.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, tArrayList)); spinner3.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, sArrayList)); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { sArrayList = new ArrayList<String>(); Category c = categoryArrayList.get(catpos); typeArrayList = c.getTypeArrayList(0); Type t = typeArrayList.get(pos); serviceArrayList = t.getServiceArrayList(0); for(int i=0;i<serviceArrayList.size();i++) sArrayList.add(serviceArrayList.get(i).getName()); spinner3.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, sArrayList)); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); 

Esto debe hacer lo que quieras, sin embargo, no estoy seguro de por qué estás leyendo un json, pero parece que ya conoce el contenido. Es decir, quieres algo tan específico en spinner 3

  categoryArrayList = new ArrayList<Category>(); cArrayList = new ArrayList<String>(); ................................... JSONArray jarray = jsono.getJSONArray("categories"); for (int i = 0; i < jarray.length(); i++) { JSONObject object = jarray.getJSONObject(i); Category language = new Category(); language.setName(object.getString("category_name")); Log.d("category_name::-", object.getString("category_name")); language.setTypeArrayList(typeArrayList); categoryArrayList.add(language); cArrayList.add(categoryArrayList.get(i).getName()); } JSONArray jsarray = jarray.getJSONObject(0).getJSONArray("types"); typeArrayList = new ArrayList<Type>(); tArrayList = new ArrayList<String>(); for (int j = 0; j < jsarray.length(); j++) { JSONObject jjobject = jsarray.getJSONObject(j); Type genre = new Type(); genre.setName(jjobject.getString("type_name")); Log.d("type_name::-", jjobject.getString("type_name")); genre.setServiceArrayList(serviceArrayList); typeArrayList.add(genre); tArrayList.add(typeArrayList.get(j).getName()); } JSONArray jsonarray = jsarray.getJSONObject(1).getJSONArray("services"); serviceArrayList = new ArrayList<Service>(); sArrayList = new ArrayList<String>(); for (int k = 0; k < jsonarray.length(); k++) { JSONObject jjjobject = jsonarray.getJSONObject(k); Service movie = new Service(); movie.setName(jjjobject.getString("service_name")); Log.d("service_name::-", jjjobject.getString("service_name")); serviceArrayList.add(movie); sArrayList.add(serviceArrayList.get(k).getName()); } return true; 

Mi estrategia sería:

1) Primero, llene su hilandero 1 y llene su hilandero 2, 3 según el elemento seleccionado (que es el primer elemento) del hilador 1.

2) Poner spinner1.setOnItemSelectedListener() y enviar un evento cuando el elemento se cambia en el hilador 1 dentro de este método. Para enviar eventos, utilice Otto .

3) Registre a Otto en su Activity , Fragment y @Subscribe a ese evento. Por lo tanto, cuando selecciona el elemento en el hilador 1, se le notificará inmediatamente en @Subscribe y tendrá que cambiar su hilandera 2,3 con spinner1.setAdapter() y spinner2.setAdapter() .

Usted tArrayList se está poblando erróneamente. Estás poblando tu Spinner con este código:

  spinner2.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, tArrayList)); 

Pero la variable tArrayList sólo obtiene el último valor que lee. Estás usando un bucle for, pero en cada bucle reinicia la variable tArrayList , así que al final sólo tendrá el último valor.

 [...] for (int i = 0; i < jarray.length(); i++) { [...] tArrayList = new ArrayList<String>(); 

Una de las soluciones podría ser algo así:

  • Crear una lista de listas
  • En cada bucle, se crea una nueva variable tArrayList y se inicializa.
  • Al final del segundo bucle for (donde lo llena), agrega la lista creada a la lista global de listas.
  • Cuando selecciona y la opción de la spinner1, obtiene esa posición de la lista de la lista y lo utilizan para llenar su spinner2.

 List<List<String>> tArrayListOfLists = new ArrayList<ArrayList<>>(); for(...){ // First for loop List<String> tArrayList = new ArrayList<>(); for(...) { // Second for loop tArrayList.add("your strings"); } tArrayListOfLists.add(tArrayList); } 

A continuación, tendrá una lista de listas con los elementos que necesita. Para enumerar la selección del usuario en la ruleta y rellenarla:

 spinner1.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { // Get the selected position List<String> selectedList = tArrayListOfLists.get(position); spinner2.setAdapter(new ArrayAdapter<String>(CategoryActivity.this, android.R.layout.simple_spinner_dropdown_item, selectedList)); } @Override public void onNothingSelected(AdapterView<?> parentView) { // Clear the list 2 } }); 

Tomado de este sitio :

Este ejemplo muestra cómo rellenar segundo spinner basado en la selección de la primera hiladora.

XML: entrada de archivo de diseño

Res / layout / activity_spinner_ex4.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- Label --> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="8dip" android:text="@string/lblAcc" /> <!-- Spinner Dropdown --> <Spinner android:id="@+id/spinner1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="8dip" android:layout_marginRight="8dip" android:layout_marginTop="10dip" android:entries="@array/acc_type" /> <!-- Select Label --> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="8dip" android:text="@string/lblSubAcc" /> <!-- Spinner Dropdown --> <Spinner android:id="@+id/spinner2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:layout_marginLeft="8dip" android:layout_marginRight="8dip" /> </LinearLayout> 

XML: Entradas de archivo de cadenas

Res / values ​​/ strings.xml

 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Spinner Example</string> <string name="action_settings">Settings</string> <string name="lblAcc">Select Account Type</string> <string name="lblSubAcc">Select Account Head</string> <string-array name="acc_type"> <item>Income</item> <item>Expense</item> </string-array> </resources> 

Actividad principal

SpinnerEx4Activity.java

 package com.bar.example.androidspinnerexample; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.Toast; public class SpinnerEx4Activity extends Activity implements OnItemSelectedListener{ Spinner s1,s2; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_spinner_ex4); s1 = (Spinner)findViewById(R.id.spinner1); s2 = (Spinner)findViewById(R.id.spinner2); s1.setOnItemSelectedListener(this); } @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub String sp1= String.valueOf(s1.getSelectedItem()); Toast.makeText(this, sp1, Toast.LENGTH_SHORT).show(); if(sp1.contentEquals("Income")) { List<String> list = new ArrayList<String>(); list.add("Salary"); list.add("Sales"); list.add("Others"); ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); dataAdapter.notifyDataSetChanged(); s2.setAdapter(dataAdapter); } if(sp1.contentEquals("Expense")) { List<String> list = new ArrayList<String>(); list.add("Conveyance"); list.add("Breakfast"); list.add("Purchase"); ArrayAdapter<String> dataAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list); dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); dataAdapter2.notifyDataSetChanged(); s2.setAdapter(dataAdapter2); } } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } } 
  • Cómo ocultar un elemento en un Spinner de Android
  • Spinner en el cambio de valor
  • La lista desplegable de Spinner y la orientación de la pantalla cambian el problema
  • Cómo utilizar Android Spinner como una lista desplegable
  • Org.json.JSONArray no se puede convertir en JSONObject (Populating spinner from webservice)
  • Spinner eliminar elementos
  • Android numberpicker para números de coma flotante
  • Spinner no puede cargar una matriz de números enteros?
  • Android - Set Spinner Punto de inicio
  • ¿Cómo cambiar el tamaño del texto y el color de texto del hilandero?
  • IndexOutOfBounds en Spinner?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.