Изменение содержимого списка Spinner после выбора элемента Android - PullRequest
0 голосов
/ 14 января 2020

Есть ли способ изменить отображаемый список внутри 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) {

        }
    });
}

Делая это в основном делает то, что мне нужно, но это также приводит к бесконечному l oop, так как 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 Ответ

1 голос
/ 14 января 2020

твой код мертвый oop. и если данные элемента адаптера изменились, например, добавить, удалить, очистить с помощью adapter, вы можете использовать метод notifyDataSetChanged.

Уведомляет прикрепленных наблюдателей о том, что базовые данные были изменены, и любое представление отражая набор данных, следует обновить саму sh.

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();

Во-вторых, вы также можете установить Тег, который нужно сделать, когда init 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, используйте тег check.

...