Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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

  • Establecer el elemento seleccionado de la hiladora mediante programación
  • Android - ¿Cómo obtener el valor del elemento seleccionado de una ruleta y ponerlo en una cadena?
  • Cómo configurar el texto del hilandero actual sin cambiar los elementos de la lista de selección asociada
  • Android Spinner OnItemSelected no se llama con el mismo elemento
  • Android - Eliminar Spinner Dropdown Arrow
  • Selector de ícono, subtítulo y lista desplegable de la barra de acción de Android
  • ¿Cómo obtener el valor de Spinner?
  • Cómo colorear y alinear el elemento spinner en android?
  • 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 } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.