【问题标题】:Get the String value from Second spinner position从第二个微调器位置获取字符串值
【发布时间】:2019-01-16 19:02:00
【问题描述】:

我有两个微调器。

第一个微调器值是加德满都和巴克塔普尔,根据第一个微调器值,第二个微调器值被填充。

我的问题是,当我选择 Kathmandu 并从第二个微调器中选择第一项时,我得到了第二个微调器的第一项,这是我所期望的。

但是,当我首先从 Spinner 中选择 Bhaktapur 或 Kathmandu 以下的任何项目时,然后在从第二个 Spinner 中选择第一个项目位置时,我会得到第一个 Spinner 值本身,即 Bhaktapur 而不是“Bageswori”

但如果我选择第二个项目位置,那么没有问题,即我得到预期结果的“Balkot”。

所以问题在于,当我从第一个微调器中选择第一个项目位置下方的任何项目并从第二个微调器中选择第一个项目位置时。它返回第一个微调器的第一个项目值,而不是从第二个微调器中选择的值。

我的代码是

public class UploadBook extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
   
    String item = "start";
    String condition = "start"; // for spinner
    FirebaseStorage storage;
    public Books b;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_upload_book);
        getSupportActionBar().setTitle("Upload Room Info");
        getSupportActionBar().setBackgroundDrawable(
                new ColorDrawable(Color.parseColor("#8abe50")));

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)
            ActivityCompat.requestPermissions(UploadBook.this, new String[]{android.Manifest.permission.CAMERA, android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 11);
        database = FirebaseDatabase.getInstance();
        dbreference = database.getReference();
        fauth = FirebaseAuth.getInstance();
        mStorageRef = FirebaseStorage.getInstance().getReference();
       
        b1 = (Button) findViewById(R.id.buttonPost);
        spinnerCountry = (Spinner) findViewById(R.id.spinnerCountry);
        //implementing OnItemSelectedListener (need to override the method)

        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("Kathmandu");
        countryArray.add("Bhaktapur");
        countryArray.add("Lalitpur");
        countryArray.setNotifyOnChange(true);
        spinnerCountry.setSelection(0);
        spinnerDivision = (Spinner) findViewById(R.id.spinnerDivision);
        //implementing OnItemSelectedListener (need to override the method)
        spinnerDivision.setOnItemSelectedListener(this);
        spinnerCountry.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);

        postButtonClick();


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

        item = parent.getItemAtPosition(position).toString();
        //first spinner item position
        int countrySpinnerPosition = spinnerCountry.getSelectedItemPosition();
        switch (countrySpinnerPosition){
            case 0:
                //fill data for second spinner
                fillKathmanduDivision();
                break;
            case 1:
                //fill data for second spinner
                fillBhaktapurDivision();
                break;          
        }
        //first spinner item position
    }

    private void fillKathmanduDivision() {
        divisionArray.clear();
        divisionArray.add("Anamnagar");
        divisionArray.add("Balaju");
        divisionArray.notifyDataSetChanged();
    }

    private void fillBhaktapurDivision() {
        divisionArray.clear();
        divisionArray.add("Bageswori");
        divisionArray.add("Balkot");
        divisionArray.notifyDataSetChanged();
    }

   b1.setOnClickListener(new View.OnClickListener() {

   }

   void postButtonClick() {

        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
         
                     Toast.makeText(this, item, Toast.LENGTH_SHORT).show();
          } 
    }
 }

【问题讨论】:

  • 你能显示方法 fillFirst() 和 fillSecond() 吗?
  • @ChetanJoshi 请检查我是否已更新。
  • 检查我的答案。
  • 检查我的答案

标签: java android spinner android-spinner


【解决方案1】:

请使用以下代码:

private String country_id = "", city_id = "";
private ArrayList<String> country_array;

并用数据填充您的数组:

  for (int i = 0; i < items.getResponse().size(); i++) {
      String get_country_name = items.getResponse().get(i).getCode();
      country_array.add(get_country_name);
      }

现在开始你的第一个微调器适配器:

   ArrayAdapter<String> country_spinnerArrayAdapter = new adapter_spinner(getActivity(), R.layout.spinner_header, country_array);
                                    country_spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
                                    binding.etCountry.setAdapter(country_spinnerArrayAdapter);
                                    binding.etCountry.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                                        @Override
                                        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                                            String selectedItemText = parent.getSelectedItem().toString();
                                            if (position > 0) {
                                                country_id = selectedItemText;
                                                city_id = "";
                                                Load_City(position - 1); // -1 to remove postion of the static country text
                                            }
                                        }

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

现在你的城市(第二个微调)方法:

   private void Load_City(int postion) {
        ArrayList<String> city_array = new ArrayList<String>();
        city_array.add(getString(R.string.city));



        for (int i = 0; i < items.getResponse().get(postion).getCities().size(); i++) {
            String get_city_name = items.getResponse().get(postion).getCities().get(i).getName();
            city_array.add(get_city_name);

        }

        ArrayAdapter<String> country_spinnerArrayAdapter = new adapter_spinner(getActivity(), R.layout.spinner_header, city_array);
        country_spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
        binding.etCity.setAdapter(country_spinnerArrayAdapter);

        binding.etCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String selectedItemText = parent.getSelectedItem().toString();
                if (position > 0) {
                    city_id = selectedItemText;
                }
            }

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

希望对你有帮助

【讨论】:

  • 感谢 Hossam..现在我使用了 if else 语句....它以某种方式解决了问题...我将在下一次更新中使用您的解决方案。谢谢
【解决方案2】:

您对第一个微调器的引用有误。

在下面一行

int countrySpinnerPosition = spinnerCountry.getSelectedItemPosition();

您选择了 spinnerCountry 而不是 spinnerFirst。 并且您最初将 spinnerFirst 设置为 A 的第一个位置,并且当您更改它时 - 选择 B 它的值未在 onItemSelected 方法中采用,打算选择国家这可能在微调器的 第一个 (0) 位置,因此您的第二个微调器始终设置为三而不是四。

【讨论】:

  • @Chetam 抱歉,这是错字。
  • 那么当你从微调器获取值时你应该过去代码
  • 我已经包含了 Toast 消息,它显示了我可以从中获取字符串值的值。
  • 是的,但是取值或传递错误的位置可能会出现一些错误。
  • 我重写了整个问题并更新了我的代码。希望现在你能理解我的问题
猜你喜欢
  • 1970-01-01
  • 2016-01-22
  • 2013-11-15
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2014-04-24
相关资源
最近更新 更多