选择项目后更改 Spinner 列表内容 Android
Posted
技术标签:
【中文标题】选择项目后更改 Spinner 列表内容 Android【英文标题】:Changing Spinner list content after item is selected Android 【发布时间】:2020-05-01 06:47:52 【问题描述】:有没有办法在选择后更改Spinner
内的显示列表。我有 2 个Strings
、English
和 Finnish
,我想先在选择一个时更改它们的语言,然后在选择另一个时更改它们的顺序。
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
变量。
【问题讨论】:
【参考方案1】:您的代码是一个死循环。如果适配器项数据发生变化,
如添加、删除、清除adapter
可以使用notifyDataSetChanged
方法。
通知附加的观察者底层数据已更改,任何反映数据集的视图都应自行刷新。
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)
同时你也可以clear
和addAll
,然后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();
其次,您还可以设置一个标签,以便在初始化时不调用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 更新数据,而不是每次都 init spinner。如果你只想移除初始化选择效果,使用check
标签。
【讨论】:
但是通过第一种方式..你如何改变适配器..你只是创建一个新的吗?我是否还需要添加adapter.setDropDownViewResource(...)
。
编辑问题
你有没有尝试在调用setSpinnerAdapter
之后再调用spinnerAdapter.clear()
,就像@Lenoarod之前提到的那样以上是关于选择项目后更改 Spinner 列表内容 Android的主要内容,如果未能解决你的问题,请参考以下文章
Android开发系列(二十一):Spinner的功能和使用方法以及实现列表选择框
如何制作带有初始文本“Select One”的Android Spinner?