Обучение и трудоустройство Java-программистов от Junior до Senior

spinner + notifyDataSetChanged()

 
 
 
Сообщения:38
Spinner заполняется из БД (сначала один спиннер, потом на основании его заполняю второй) и естествнно второй спинер всё время меняется!
куда нужно прописывать notifyDataSetChanged()? Вообще не врублюсь.
- пробовал при создании второго адаптера(закоментил в коде)
- пробовал при onItemSelected
не хочет работать - не обновляется спиннер, остаётся со старыми данным.

   
//первый спиннер
 private void getMarkaNames(JSONArray j){
        //Traversing through all the items in the json array
        int numberOfItemsInResp = j.length();
        for(int i=0;i<numberOfItemsInResp;i++){
            try {
                //Getting json object
                JSONObject json = j.getJSONObject(i);

                markas.add(json.getString(Config.MARKA_NAME));

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        spinner_marka.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, markas));
    }
//второй спиннер
    private void getModelNames(JSONArray j){

        int numberOfItemsInResp = j.length();
        //Traversing through all the items in the json array
        for(int i=0;i<numberOfItemsInResp;i++){
            try {
                //Getting json object
                JSONObject json = j.getJSONObject(i);
                models.add(json.getString(Config.MODEL_NAME));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        modelAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, models);
        //modelAdapter.notifyDataSetChanged();
        spinner_model.setAdapter(modelAdapter);
    }


spinner_marka.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//modelAdapter.notifyDataSetChanged();
                String marka_id;
                marka_id = getID(position);
                getModel(Config.MODEL_URL, marka_id);

            }

        });
 
 
Сообщения:225
Метод "modelAdapter.notifyDataSetChanged()" надо вызывать после того, как произошли изменения в модели, например когда добавили новую запись методом "modelAdapter.add(Object)".
 
 
Сообщения:38
в моём коде это получается где - в цикле когда добавляю или после?
и надо ли перед этим как-то очистить models?
        for(int i=0;i<numberOfItemsInResp;i++){
            try {
                //Getting json object
                JSONObject json = j.getJSONObject(i);
                models.add(json.getString(Config.MODEL_NAME));
                modelAdapter.notifyDataSetChanged(); // тут добавить или после цикла ?

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
 
       
Изменен:09 окт 2017 11:03
 
 
Сообщения:225
Попробуйте в методе "onItemSelected" главного spinner-а (если я правильно понимаю, то это марка) заполнять modelAdapter через соответствующие методы, а уже после его заполнения вызывать метод "notifyDataSetChanged".

Upd: накидал небольшой пример
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_margin="5dp">

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Brand: " />

        <Spinner
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/brands" />

    </LinearLayout>

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Model: "/>

        <Spinner
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/models"/>

    </LinearLayout>

</LinearLayout>

public class MainActivity extends AppCompatActivity
{
   @Override
   protected void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      final ArrayAdapter<String> modelsAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item);
      modelsAdapter.setNotifyOnChange(true);
      final Spinner spinnerModels = (Spinner) findViewById(R.id.models);
      spinnerModels.setAdapter(modelsAdapter);
      spinnerModels.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
      {
         @Override
         public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
         {
            modelIndex = (int) id;
         }

         @Override
         public void onNothingSelected(AdapterView<?> parent)
         {
         }
      });

      ArrayAdapter<String> brandsAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, brandsModel.getBrands());
      Spinner spinnerBrands = (Spinner) findViewById(R.id.brands);
      spinnerBrands.setAdapter(brandsAdapter);
      spinnerBrands.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
      {
         @Override
         public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
         {
            List<String> brands = brandsModel.getBrands();
            String brandName = brands.get((int) id);
            List<String> models = brandsModel.getModels(brandName);

            modelsAdapter.clear();
            modelsAdapter.addAll(models);

            int selectionIndex = id != brandIndex ? 0 : modelIndex;
            spinnerModels.setSelection(selectionIndex);

            brandIndex = (int) id;
         }

         @Override
         public void onNothingSelected(AdapterView<?> parent)
         {
         }
      });

      if(savedInstanceState != null)
      {
         brandIndex = savedInstanceState.getInt(SPINNER_BRAND_INDEX);
         modelIndex = savedInstanceState.getInt(SPINNER_MODEL_INDEX);
      }
   }

   @Override
   protected void onSaveInstanceState(Bundle outState)
   {
      super.onSaveInstanceState(outState);

      outState.putInt(SPINNER_BRAND_INDEX, brandIndex);
      outState.putInt(SPINNER_MODEL_INDEX, modelIndex);
   }

   private static final String SPINNER_BRAND_INDEX = "spinner.brand.selected.index";
   private static final String SPINNER_MODEL_INDEX = "spinner.model.selected.index";
   //
   private int brandIndex = -1;
   private int modelIndex = -1;
   //
   private BrandsModel brandsModel = new BrandsModel();
}

public class BrandsModel
{
   public BrandsModel()
   {
      Set<String> vazModels = new TreeSet<>(Arrays.asList("Vesta", "Kalina", "Granta"));
      Set<String> renaultModels = new TreeSet<>(Arrays.asList("Duster", "Logan"));
      Set<String> nissanModels = new TreeSet<>(Arrays.asList("X-Trail"));

      brands.put("LADA", vazModels);
      brands.put("RENAULT", renaultModels);
      brands.put("NISSAN", nissanModels);
   }

   public List<String> getBrands()
   {
      return new ArrayList<>(brands.keySet());
   }

   public List<String> getModels(String brandName)
   {
      return new ArrayList<>(brands.get(brandName));
   }

   private Map<String, Set<String>> brands = new TreeMap<>();
}
Изменен:09 окт 2017 18:41
 
 
Сообщения:38
супер, спасибо, сейчас разберусь что как тут работает......
 
Модераторы:demon_zxBeowulf13thShogun
Сейчас эту тему просматривают:Нет