Невозможно получить значение второго спиннера на основе первого значения спиннера - PullRequest
0 голосов
/ 13 сентября 2018

Я использую два счетчика, где значение второго счетчика основано на значении первого счетчика.

Например, если пользователь выбирает параметр A в раскрывающемся списке «Первый спиннер, затем второй спиннер», должен содержать значение (вол, корова, коза), а если пользователь выбирает вариант В, то значение второго спиннера должно содержать (Лев, Тигр и Чита).

Но я не могу этого сделать. При выборе любого значения в первом значении счетчика Second Spinner всегда загружает одно и то же значение. Ниже скриншот enter image description here

enter image description here

Как вы можете видеть, при выборе любого варианта в первом бланке мастер или диплом ... Во втором блесне значение то же самое. Оно не изменяется.

Ниже код моей деятельности

 public class UploadBook extends AppCompatActivity 
        Spinner spinnerCountry,spinnerDivision,spinner_condition;
        ArrayAdapter<String> countryArray,divisionArray;

        String item = "start";

        int count = 0;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_upload_book);
            getSupportActionBar().setTitle("Upload book");

            spinnerCountry = (Spinner) findViewById(R.id.spinnerCountry);
            //implementing OnItemSelectedListener (need to override the method)
            spinnerCountry.setOnItemSelectedListener(this);

            countryArray = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
            countryArray.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            spinnerCountry.setAdapter(countryArray);

            countryArray.add("Master");

            countryArray.add("Diploma");

            countryArray.setNotifyOnChange(true);

            spinnerCountry.setSelection(0);

            spinnerDivision = (Spinner) findViewById(R.id.spinnerDivision);
            //implementing OnItemSelectedListener (need to override the method)
            spinnerDivision.setOnItemSelectedListener(this);

            divisionArray = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
            divisionArray.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            spinnerDivision.setAdapter(divisionArray);

        }

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            item = parent.getItemAtPosition(position).toString();
            count = position;
            //first spinner item position
            int countrySpinnerPosition = spinnerCountry.getSelectedItemPosition();
            switch (countrySpinnerPosition){
                case 1:
                    //fill data for second spinner
                    fillMasterDivision();
                    break;
                case 2:
                    //fill data for second spinner
                    fillDiplomaDivision();
                    break;

            }

        }

        private void fillMasterDivision() {
            divisionArray.clear();
            divisionArray.add("Select Subject:-");
            divisionArray.add("MSC Physics");
            divisionArray.add("MSC Chemistry");

            divisionArray.notifyDataSetChanged();
        }

        private void fillDiplomaDivision() {
            divisionArray.add("Select Subject:-");
            divisionArray.add("Science");
            divisionArray.add("CTEVT");     
        }

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

        }

Пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

См. Мой пример:

У меня есть 2 счетчика, firstSpinner и secndSpinner , Second зависит от First.

Сначала необходимо инициализировать счетчики в методе onCreate и выполнить шаги:

1 - Вы вставите в первый счетчик свои данные («Мастер», «Диплом»);

2 - вы создадите функцию, которая будет обновлять второй счетчик соответствующими значениями.

firstSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
        createSecondSpinnerByFirst(position);
     }

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

private void createSecondSpinnerByFirst(Integer position) {
    List<String> secValues = new ArrayList<>();
    switch (position) {
        case 1:
            // insert in secValues array the strings of this condition
            break;
        case 2:
            // insert in secValues array the strings of this condition
            break;
    }

    // usually I use Adapter
    final SpinnerAdapter adapter = new SpinnerAdapter(this, secValues);
    secndSpinner.setAdapter(adapter);
}

//Code of myAdapter
public class SpinnerAdapter extends ArrayAdapter<String> {

    private Context context;
    private List<String> mValues;

    public SpinnerAdapter(Context ctx, List<String> values) {
        super(ctx, 0, values);
        context = ctx;
        mValues = values;
    }

    @Override
    public int getCount() {
        return mValues.size();
    }

    @Override
    public Process getItem(int position) {
        return mValues.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return returnLayoutSpinner(context, convertView, mValues.get(position));
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return returnLayoutSpinner(context, convertView, mValues.get(position));
    }
}

//My function to return the adapter view
private View returnLayoutSpinner(Context context, View convertView, String value) {
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(
                R.layout.spinner_items_view, null);
    }
    TextView txt = convertView.findViewById(R.id.txtSpinnerItem);
    txt.setText(value, 25);
    return convertView;
}

//spinner_items_view.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/txtSpinnerItem"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center|left"
    android:padding="13dp"
    android:textColor="@android:color/black"
    android:textSize="16sp">
</TextView>
0 голосов
/ 13 сентября 2018

Прежде всего, вы используете одинаковые onItemSelected для обоих счетчиков. поэтому удалите spinnerCountry.setOnItemSelectedListener(this); и spinnerDivision.setOnItemSelectedListener(this);

После установки данных в spinnerCountry используйте это.

spinnerCountry.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
              if(i == 0){
                fillMasterDivision();
              }else{
                fillBachelorDivision();
              }

            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {


            }
        });

и очистите массив Деления в fillBachelorDivision()

0 голосов
/ 13 сентября 2018

В вашем коде есть две ошибки.

  1. CountrySpinnerPosition будет 0 и 1 для вашего случая, поэтому регистр должен быть "case 0" и "case 1".

  2. В методе fillDiplomaDivision вы должны сначала очистить список, а после добавления в список вы должны вызвать notifyDataSetChanged ().

0 голосов
/ 13 сентября 2018

попытаться очистить arraylist и notifydatasetranstered во втором методе тоже

    private void fillDiplomaDivision() {
    divisionArray.clear();
    divisionArray.add("Select Subject:-");
    divisionArray.add("Science");
    divisionArray.add("CTEVT");

    divisionArray.notifyDataSetChanged();
}
...