无法根据第一个 Spinner 值获得第二个 Spinner 值

Unable to get Second Spinner value based on first Spinner Value

我正在使用两个微调器,其中第二个微调器值基于第一个微调器值。

例如,如果用户 Select First Spinner 中的选项 A Then Second Spinner 下拉列表必须包含值(牛、牛、山羊),如果用户 select 选项 B,则第二个 Spinner 值必须包含(狮子、老虎和猎豹)。

但是我做不到。在 selecting 第一个微调器值中的任何值时,第二个微调器总是加载相同的值。下面是截图

如您所见,在 select 中第一个微调大师或文凭中的任何选项...在第二个微调中值是 same.it 没有改变。

下面是我的Activity代码

 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) {

        }

请帮忙。

也尝试在第二种方法中清除 arraylist 和 notifydatasetchanged

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

    divisionArray.notifyDataSetChanged();
}

首先,您对两个微调器使用相同的 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()

中清除您的 Division 数组

你的代码有两个错误。

  1. CountrySpinnerPosition 将是 0 和 1 你的情况所以情况应该是 "case 0" 和 "case 1".

  2. 在 fillDiplomaDivision 方法中,您必须先清除列表,然后在添加到列表后,您必须调用 notifyDataSetChanged()。

看我的例子:

我有 2 个微调器,firstSpinnersecndSpinner,第二个取决于第一个。

首先你必须在 onCreate 方法中初始化微调器,然后按照以下步骤操作:

1 - You'll insert in first spinner your data ("Master", "Diploma");

2 - You'll create a function that will update the second spinner with associated values.

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>
private void fillDiplomaDivision() {
        //add this line in your code and it solve
        divisionArray.clear();
        divisionArray.add("Select Subject:-");
        divisionArray.add("Science");
        divisionArray.add("CTEVT");     
    }