JSON Parsing Issue with Spinners
Все мои прядильщики связаны друг с другом, они не являются независимыми, я хотел бы показать варианты в spinner2 и spinner3 на основе выбора в spinner1 (я имею в виду на основе категории, выбранной пользователем в spinner1)
В 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));
Ответы
Ответ 1
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 Method
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
}
});
Ответ 2
Это должно делать то, что вы хотите, однако я не уверен, почему вы читаете 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;
Ответ 3
Моя стратегия:
1) Сначала залейте свой счетчик 1 и залейте свой счетчик 2, 3 в соответствии с выбранным элементом (который является первым элементом) счетчика 1.
2) Поместите spinner1.setOnItemSelectedListener()
и отправьте событие, когда элемент изменен на spinner 1 внутри этого метода. Чтобы отправить событие, используйте Otto.
3) Зарегистрируйте Otto
на своих Activity
, Fragment
и @Subscribe
на это событие. Поэтому, когда вы выбираете элемент в spinner 1, вы сразу получите уведомление внутри @Subscribe
, и вам нужно изменить свой счетчик 2,3 с помощью spinner1.setAdapter()
и spinner2.setAdapter()
там.
Ответ 4
Вы 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 и инициализируете ее.
- В конце второго цикла for (где вы его заполняете) вы добавляете созданный список в глобальный список списков.
- Когда вы выбираете и выбираете опцию spinner1, вы получаете эту позицию из списка List и используете ее для заполнения 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
}
});
Ответ 5
Взято из этот сайт:
В этом примере показано, как заполнить второй счетчик на основе выбора первого счетчика.
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
}
}