【问题标题】:Changing Spinner list content after item is selected Android选择项目后更改 Spinner 列表内容 Android
【发布时间】:2020-05-01 06:47:52
【问题描述】:

有没有办法在选择后更改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 变量。

【问题讨论】:

    标签: android spinner android-adapter onitemclicklistener onitemselectedlistener


    【解决方案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)
    

    同时你也可以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();
    
    

    其次,您还可以设置一个标签,以便在初始化时不调用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之前提到的那样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多