【问题标题】:Unable to get Second Spinner value based on first Spinner Value无法根据第一个 Spinner 值获取第二个 Spinner 值
【发布时间】:2018-09-13 10:09:29
【问题描述】:

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

例如,如果用户在 First Spinner 中选择选项 A,则 Second Spinner 下拉列表必须包含值(ox、cow、goat),如果用户选择选项 B,则第二个 Spinner 值必须包含(Lion、Tiger 和 Cheetha)。

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

如您所见,在第一个微调器大师或文凭中选择任何选项...在第二个微调器值是相同的。它不会改变。

下面是我的活动代码

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

        }

请帮忙。

【问题讨论】:

  • 您似乎没有使用正确的方法调用。在onItemSelectedswitch 中,您使用的是fillBachelorDivisionfillMasterDivision
  • @BirendraSingh 那么我该如何使用它...我遵循了随机博客中的一个教程,它在那里工作,但是当我在我的应用程序中实现时......它没有。
  • 看起来你是想打电话给fillDiplomaDivision而不是fillBachelorDivision.
  • 对不起,我已经编辑了我的问题..现在请检查

标签: java android android-spinner


【解决方案1】:

你的代码有两个错误。

  1. CountrySpinnerPosition 对于您的情况将是 0 和 1,因此情况应该是“case 0”和“case 1”。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • Thaks Diwakar 这样一个简单而好的解决方案......我很遗憾我错过了那条线。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      看我的例子:

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

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

      1 - 您将在第一个微调器中插入您的数据(“Master”、“Diploma”);

      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>
      

      【讨论】:

        【解决方案5】:
        private void fillDiplomaDivision() {
                //add this line in your code and it solve
                divisionArray.clear();
                divisionArray.add("Select Subject:-");
                divisionArray.add("Science");
                divisionArray.add("CTEVT");     
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多