2015-09-11 4 views
11

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

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

Итак, где моя ошибка? Вот мой JSON код Синтаксический:

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

А вот как я заселение Спиннерс:

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

Я думаю, вы должны исправить вы ожидали в 'spinner3', потому что не относятся к' Категория Ā' массив – Mohit

+0

@Mohit, но мои прядильщики связаны друг с другом, если пользователь выбирает категорию A в spinner1, а затем отображает только данные, которые принадлежат к CategoryA в spinner2 и spinner3, таким же образом для CategoryB ... – Oreo

+0

вот что я повторяю .... прошу проследить за ожидаемым выходом на ваш json ..Я имею в виду, что нет 'CatA TypeB ServiceA' в' "category_name": "Категория A", ' – Mohit

ответ

2

Это должно делать то, что вы хотите, однако, я не знаю, почему вы читаете JSON, но вы, кажется, уже знаете контент. то есть вы хотите что-то настолько специфичны в блесны 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; 
+0

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

5

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 

     } 
    }); 
+0

извините, но мне нужно решение в моем существующем коде, потому что я знаю, что делаю очень маленькую ошибку .. бы вы укажите мне свою ошибку, просто дайте мне знать, как я могу использовать эту строку в своем коде в соответствии с моим существующим кодом: tArrayList = hasMap.get (categories.get (0)); – Oreo

+0

Умножил ли счетчик каждый раз, когда изменился счетчик? – arun

+0

Можете ли вы просто сказать мне, что мне нужно написать в моем существующем коде, чтобы получить это: tArrayList = hasMap.get (categories.get (0)); потому что это единственное, чего я не вижу в своем коде, это покажет spinner2 с элементами categoryA только в onCreate – Oreo

2

Моя стратегия будет:

1) Во-первых, заполнить ваш вертушка 1 и заполнить ваш кок 2, 3 по к выбранному элементу (который является первым элементом) счетчика 1.

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

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

2

Вы заполняете 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 
    } 
}); 
2

Взятые из this site:

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

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: Строки Записи файла

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

    } 
}