选择项目后更改微调列表内容 Android

Changing Spinner list content after item is selected Android

有没有办法在选择后更改 Spinner 中显示的列表。我有 2 个 StringsEnglishFinnish,我想先在选择一个时更改它们的语言,然后在选择另一个时更改它们的顺序。

private void initLanguageSpinner() {

    List<String> spinnerLocale = new ArrayList<>();
    if ((currentdocumentLocale.toString().startsWith("deviceNameFi") || currentdocumentLocale.getLanguage().equals("fi"))) {
        spinnerLocale.add(getLocalizedResources(context, currentdocumentLocale).getString(R.string.finnish_language));
        spinnerLocale.add(getLocalizedResources(context, currentdocumentLocale).getString(R.string.english_language));
    } else {
        spinnerLocale.add(getLocalizedResources(context, currentdocumentLocale).getString(R.string.english_language));
        spinnerLocale.add(getLocalizedResources(context, currentdocumentLocale).getString(R.string.finnish_language));

    }

    ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), R.layout.document_spinner_item, spinnerLocale);
    adapter.setDropDownViewResource(R.layout.document_spinner_dropdown_item);
    customerSelectedLanguageSpinner.setAdapter(adapter);
    customerSelectedLanguageSpinner.setSelection(0, false);
    customerSelectedLanguageSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if (customerSelectedLanguageSpinner.getSelectedItem().toString().equals(getLocalizedResources(context, currentdocumentLocale).getString(R.string.finnish_language))) {
                onLocaleChangedFi();
                initLanguageSpinner();
            } else if (customerSelectedLanguageSpinner.getSelectedItem().toString().equals(getLocalizedResources(context, currentdocumentLocale).getString(R.string.english_language))) {
                onLocaleChangedEng();
                initLanguageSpinner();
            }
        }

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

        }
    });
}

通过这样做,它基本上可以满足我的需要,但它也会进入无限循环,因为 onItemSelected 总是在初始化后调用,即使我执行 .setSelection(0, false)。有什么办法可以满足我的需求吗?

编辑

所以我尝试创建一个新的 adapter 然后通知它更改。

private ArrayAdapter<String> spinnerAdapter;

private void initLanguageSpinner() {

    List<String> spinnerLocale = new ArrayList<>();
    if ((currentdocumentLocale.toString().startsWith("deviceNameFi") || currentdocumentLocale.getLanguage().equals("fi"))) {
        spinnerLocale.add(getLocalizedResources(context, currentdocumentLocale).getString(R.string.finnish_language));
        spinnerLocale.add(getLocalizedResources(context, currentdocumentLocale).getString(R.string.english_language));
    } else {
        spinnerLocale.add(getLocalizedResources(context, currentdocumentLocale).getString(R.string.english_language));
        spinnerLocale.add(getLocalizedResources(context, currentdocumentLocale).getString(R.string.finnish_language));

    }

    spinnerAdapter = new ArrayAdapter<>(getActivity(), R.layout.document_spinner_item, spinnerLocale);
    spinnerAdapter.setDropDownViewResource(R.layout.document_spinner_dropdown_item);
    customerSelectedLanguageSpinner.setAdapter(spinnerAdapter);
    customerSelectedLanguageSpinner.setSelection(0, false);
    customerSelectedLanguageSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if (customerSelectedLanguageSpinner.getSelectedItem().toString().equals(getLocalizedResources(context, currentdocumentLocale).getString(R.string.finnish_language))) {
                setSpinnerAdapter(customerSelectedLanguageSpinner.getSelectedItem().toString()); 
                onLocaleChangedFi();
            } else if (customerSelectedLanguageSpinner.getSelectedItem().toString().equals(getLocalizedResources(context, currentdocumentLocale).getString(R.string.english_language))) {
                setSpinnerAdapter(customerSelectedLanguageSpinner.getSelectedItem().toString());
                onLocaleChangedEng();

            }
        }

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

        }
    });
}

private void setSpinnerAdapter(String language){
    if(language.equals("fi")){
        String[] myListFinnish = new String[] { getLocalizedResources(context, currentdocumentLocale).getString(R.string.finnish_language), getLocalizedResources(context, currentdocumentLocale).getString(R.string.english_language)};
        spinnerAdapter = new ArrayAdapter<>(getActivity(), R.layout.document_spinner_item, myListFinnish);
    } else {
        String[] myListEnglish = new String[] { getLocalizedResources(context, currentdocumentLocale).getString(R.string.english_language), getLocalizedResources(context, currentDocumentLocale).getString(R.string.finnish_language)};
        spinnerAdapter = new ArrayAdapter<>(getActivity(), R.layout.document_spinner_item, myListEnglish);
    }
    spinnerAdapter.setDropDownViewResource(R.layout.document_spinner_dropdown_item);
    spinnerAdapter.notifyDataSetChanged();
}

这样它甚至不会改变列表字符串或顺序。 onLocaleChangedEng(); 基本上改变了应用程序中的 Locale 变量。

你的代码是一个死循环。如果适配器项数据发生变化, 例如通过 adapter 添加、删除、清除你可以使用 notifyDataSetChanged 方法。

Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

adapter.clear()/add(object)/addAll();
adapter.notifyDataSetChanged();

然后视图将更新但不会初始化。

如果整个数据都变了,也可以重新创建一个适配器,然后设置数据

dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, newStringList);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerCategory.setAdapter(dataAdapter)

同时还可以clearaddAll,然后notifyDataSetChanged

adapter.clear() //remove all data;
adapter.addAll(source);
adapter.notifyDataSetChanged();

//or remove it, then insert it in the first. that is acturl for your conditon
adapter.remove(objcet) //remove special data;
adapter.insert(object,index);
adapter.notifyDataSetChanged();

其次,您还可以设置一个Tag,使onItemSelected在初始化时不被调用。代码如下:

//define a tag when first it is 0
int check = 0;
//then in the onItemSelected add a check condition
public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) {
   if(++check> 1) {
      //do some things when item selected.
   }
}

使用 notifyDataSetChanged 更新数据,而不是每次初始化微调器。如果您只想删除初始选择的效果,请使用 check 标签。