Intereting Posts
Где хранить конфиденциальную глобальную информацию, такую ​​как ключи API в приложении Android? Android Как перемещать карту под маркером Есть ли способ сделать Runnable run () для исключения? Android: что лучше, разработать приложение для Android на Mac или Windows-ПК? Стили homeAsUpIndicator не применяются к проекту Android Studio по умолчанию Добавление учетной записи через менеджера аккаунта Что такое сокращение, чтобы извлечь строки из кода Android в файл strings.xml в Intellij? Как загрузить изображение в синтаксический анализатор, используя parse api в android Как использовать токен, возвращенный GoogleAuthUtil.getToken, с моим брандмауэром App Engine Самый эффективный способ изменения размера растровых изображений на Android? Cordova 3.0 FileWriter THREAD WARNING: exec () вызов File.write заблокировал основной поток … должен использовать CordovaInterface.getThreadPool () Переместите экран входящего вызова по умолчанию в фоновый режим на TelephonyManager.CALL_STATE_RINGING на Android Библиотека штрих-кода Google Vision не найдена Как использовать RecyclerView внутри NestedScrollView? На Android, как вы переключаете действия программно?

JSON Parsing Issue with Spinners

Все мои прядильщики связаны друг с другом, они не являются независимыми, я хотел бы показать варианты в spinner2 и spinner3 на основе выбора в spinner1 (я имею в виду на основе категории, выбранной пользователем в spinner1)

В onCreate я onCreate данные в Spinners, но в spinner2 и spinner3 я получаю данные, которые принадлежат к CategoryB, тогда как они должны заполняться только данными CategoryA.

Итак, где моя ошибка? Вот мой код 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; } 

И вот как я населяю 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)); 

Solutions Collecting From Web of "JSON Parsing Issue with Spinners"

Oreo. Вот полный код.

Класс категории

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

Тип класса

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

Класс обслуживания

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

Инициализировать глобальные

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

doInbackground

  //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

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

Это должно делать то, что вы хотите, однако я не уверен, почему вы читаете json, но, похоже, вы уже знаете контент. Т.е. вы хотите что-то такое конкретное в 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; 

Моя стратегия:

1) Сначала залейте свой счетчик 1 и залейте свой счетчик 2, 3 в соответствии с выбранным элементом (который является первым элементом) счетчика 1.

2) Поместите spinner1.setOnItemSelectedListener() и отправьте событие, когда элемент изменен на spinner 1 внутри этого метода. Чтобы отправить событие, используйте Отто .

3) Зарегистрируйте Otto в своей Activity , Fragment и @Subscribe на это событие. Поэтому, когда вы выбираете элемент в spinner 1, вы сразу получите уведомление внутри @Subscribe и вам нужно изменить свой счетчик 2,3 с помощью spinner1.setAdapter() и spinner2.setAdapter() .

Вы tArrayList заселены tArrayList . Вы заполняете свой Spinner этим кодом:

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

Но переменная tArrayList получает только последнее значение, которое он читает. Вы используете цикл for, но в каждом цикле вы перезапускаете переменную tArrayList , поэтому в конце она будет иметь только последнее значение.

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

Одним из решений может быть что-то вроде этого:

  • Создать список списков
  • В каждом цикле вы создаете новую переменную tArrayList и инициализируете ее.
  • В конце второго цикла цикла (где вы его заполняете) вы добавляете созданный список в глобальный список списков.
  • Когда вы выбираете и выбираете опцию spinner1, вы получаете эту позицию из списка списка и используете ее для заполнения вашего 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); } 

Затем у вас будет список списков с необходимыми элементами. Чтобы просмотреть список пользователей на счетчике и заполнить его:

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

С этого сайта :

В этом примере показано, как заполнить второй счетчик на основе выбора первого счетчика.

XML: вставка файла макета

разреш / макет / 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: строковые записи файлов

RES / значения / 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> 

Основная деятельность

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 } }