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)); 

5 Solutions collect form web for “JSON Parsing problema con Spinners”

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 } } 
  • Android Spinner utilizando ArrayList <String>
  • Android- múltiples hilanderos
  • Refrescar un Spinner
  • Estoy tratando de crear un spinner dinámico
  • Alternativa a la CLASE SPINNER ALTAMENTE FLAWED en Android
  • Multi spinner de selección en android sin AlertDialog
  • ICS Spinner ("desplegable" en lugar de diálogo) en versiones anteriores de Android
  • Spinner Tamaño Pequeño
  • Android spinner no activó onItemSelected
  • Android Spinner: ¿Cómo capturar cuando el usuario sale spinner dejando el valor seleccionado como-es?
  • Alinee los valores del hilador a la derecha en lugar de a la izquierda
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.