如何在Android中动态更改spinner中的android:entries数组列表

时间:2017-01-25 07:08:58

标签: android json listview android-spinner android-alertdialog

我正在开发一个Android项目,我有2个自定义微调器

  1. 国家
  2. 我使用下面的代码来使用自定义列表视图填充微调器。

    xml代码:

    <com.infantstudio.CatholicMithrulu.Spinner.SearchableSpinnerState
                android:id="@+id/spinner2"
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:entries="@array/state"
                app:hintTextState="Select"/>
    

    SearchableListDialogState.class

    package com.infantstudio.CatholicMithrulu.Spinner;
    
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.app.DialogFragment;
    import android.app.SearchManager;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.SearchView;
    
    import com.infantstudio.CatholicMithrulu.R;
    
    import java.io.Serializable;
    import java.util.List;
    
    public class SearchableListDialogState extends DialogFragment implements
            SearchView.OnQueryTextListener, SearchView.OnCloseListener {
    
        private static final String ITEMS = "items";
    
        private ArrayAdapter listAdapter;
    
        private ListView _listViewItems;
    
        private SearchableListDialogState.SearchableItem _searchableItem;
    
        private OnSearchTextChanged _onSearchTextChanged;
    
        private SearchView _searchView;
    
        private String _strTitle;
    
        private String _strPositiveButtonText;
    
        private DialogInterface.OnClickListener _onClickListener;
    
        public SearchableListDialogState() {
    
        }
    
        public static SearchableListDialogState newInstance(List items) {
            SearchableListDialogState multiSelectExpandableFragment = new
                    SearchableListDialogState();
    
            Bundle args = new Bundle();
            args.putSerializable(ITEMS, (Serializable) items);
    
            multiSelectExpandableFragment.setArguments(args);
    
            return multiSelectExpandableFragment;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams
                    .SOFT_INPUT_STATE_HIDDEN);
            return super.onCreateView(inflater, container, savedInstanceState);
        }
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
    
            // Getting the layout inflater to inflate the view in an alert dialog.
            LayoutInflater inflater = LayoutInflater.from(getActivity());
    
            // Crash on orientation change #7
            // Change Start
            // Description: As the instance was re initializing to null on rotating the device,
            // getting the instance from the saved instance
            if (null != savedInstanceState) {
                _searchableItem = (SearchableItem) savedInstanceState.getSerializable("item");
            }
            // Change End
    
            View rootView = inflater.inflate(R.layout.searchable_list_dialog, null);
            setData(rootView);
    
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity());
            alertDialog.setView(rootView);
    
            String strPositiveButton = _strPositiveButtonText == null ? "CLOSE" : _strPositiveButtonText;
            alertDialog.setPositiveButton(strPositiveButton, _onClickListener);
    
            String strTitle = _strTitle == null ? "Select Item" : _strTitle;
            alertDialog.setTitle(strTitle);
    
            final AlertDialog dialog = alertDialog.create();
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams
                    .SOFT_INPUT_STATE_HIDDEN);
            return dialog;
        }
    
        // Crash on orientation change #7
        // Change Start
        // Description: Saving the instance of searchable item instance.
        @Override
        public void onSaveInstanceState(Bundle outState) {
            outState.putSerializable("item", _searchableItem);
            super.onSaveInstanceState(outState);
        }
        // Change End
    
        public void setTitle(String strTitle) {
            _strTitle = strTitle;
        }
    
        public void setPositiveButton(String strPositiveButtonText) {
            _strPositiveButtonText = strPositiveButtonText;
        }
    
        public void setPositiveButton(String strPositiveButtonText, DialogInterface.OnClickListener onClickListener) {
            _strPositiveButtonText = strPositiveButtonText;
            _onClickListener = onClickListener;
        }
    
        public void setOnSearchableItemClickListener(SearchableItem searchableItem) {
            this._searchableItem = searchableItem;
        }
    
        public void setOnSearchTextChangedListener(OnSearchTextChanged onSearchTextChanged) {
            this._onSearchTextChanged = onSearchTextChanged;
        }
    
        private void setData(View rootView) {
            SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context
                    .SEARCH_SERVICE);
    
            _searchView = (SearchView) rootView.findViewById(R.id.search);
            _searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName
                    ()));
            _searchView.setIconifiedByDefault(false);
            _searchView.setOnQueryTextListener(this);
            _searchView.setOnCloseListener(this);
            _searchView.clearFocus();
            InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context
                    .INPUT_METHOD_SERVICE);
            mgr.hideSoftInputFromWindow(_searchView.getWindowToken(), 0);
    
    
            List items = (List) getArguments().getSerializable(ITEMS);
    
            _listViewItems = (ListView) rootView.findViewById(R.id.listItems);
    
            //create the adapter by passing your ArrayList data
            listAdapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1,items);
    
            //attach the adapter to the list
            _listViewItems.setAdapter(listAdapter);
    
            _listViewItems.setTextFilterEnabled(true);
    
            _listViewItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    _searchableItem.onSearchableItemClicked(listAdapter.getItem(position), position);
                    getDialog().dismiss();
                }
            });
        }
    
        @Override
        public boolean onClose() {
            return false;
        }
    
        @Override
        public boolean onQueryTextSubmit(String s) {
            _searchView.clearFocus();
            return true;
        }
    
        @Override
        public boolean onQueryTextChange(String s) {
    //        listAdapter.filterData(s);
            if (TextUtils.isEmpty(s)) {
    //                _listViewItems.clearTextFilter();
                ((ArrayAdapter) _listViewItems.getAdapter()).getFilter().filter(null);
            } else {
                ((ArrayAdapter) _listViewItems.getAdapter()).getFilter().filter(s);
            }
            if (null != _onSearchTextChanged) {
                _onSearchTextChanged.onSearchTextChanged(s);
            }
            return true;
        }
    
        public interface SearchableItem<T> extends Serializable {
            void onSearchableItemClicked(T item, int position);
        }
    
        public interface OnSearchTextChanged {
            void onSearchTextChanged(String strText);
        }
    }
    

    SearchableSpinnerState.class

    package com.infantstudio.CatholicMithrulu.Spinner;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.ContextWrapper;
    import android.content.res.TypedArray;
    import android.text.TextUtils;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    
    import android.widget.ArrayAdapter;
    import android.widget.Spinner;
    import android.widget.SpinnerAdapter;
    import android.widget.Toast;
    
    import com.infantstudio.CatholicMithrulu.Adddata;
    import com.infantstudio.CatholicMithrulu.R;
    import java.util.ArrayList;
    
    import java.util.List;
    
    
    public class SearchableSpinnerState extends Spinner implements View.OnTouchListener,
            SearchableListDialogState.SearchableItem {
    
        String selectedItem;
        //this string above will store the value of selected item.
    
        public static final int NO_ITEM_SELECTED = -1;
        private Context _context;
        private List _items;
        private SearchableListDialogState _searchableListDialog;
    
        private boolean _isDirty;
        private ArrayAdapter _arrayAdapter;
        private String _strHintText;
        private boolean _isFromInit;
    
        public SearchableSpinnerState(Context context) {
            super(context);
            this._context = context;
            init();
        }
    
        public SearchableSpinnerState(Context context, AttributeSet attrs) {
            super(context, attrs);
            this._context = context;
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SearchableSpinnerState);
            final int N = a.getIndexCount();
            for (int i = 0; i < N; ++i) {
                int attr = a.getIndex(i);
                if (attr == R.styleable.SearchableSpinnerState_hintTextState) {
                    _strHintText = a.getString(attr);
                }
            }
            a.recycle();
            init();
        }
    
        public SearchableSpinnerState(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            this._context = context;
            init();
        }
    
        private void init() {
            _items = new ArrayList();
            System.out.println("items"+_items);
            _searchableListDialog = SearchableListDialogState.newInstance
                    (_items);
            _searchableListDialog.setOnSearchableItemClickListener(this);
            setOnTouchListener(this);
    
            _arrayAdapter = (ArrayAdapter) getAdapter();
            if (!TextUtils.isEmpty(_strHintText)) {
                ArrayAdapter arrayAdapter = new ArrayAdapter(_context, android.R.layout
                        .simple_list_item_1, new String[]{_strHintText});
                _isFromInit = true;
                setAdapter(arrayAdapter);
            }
        }
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
    
                if (null != _arrayAdapter) {
    
                    // Refresh content #6
                    // Change Start
                    // Description: The items were only set initially, not reloading the data in the
                    // spinner every time it is loaded with items in the adapter.
                    _items.clear();
                    for (int i = 0; i < _arrayAdapter.getCount(); i++) {
                        _items.add(_arrayAdapter.getItem(i));
                    }
                    // Change end.
    
                    _searchableListDialog.show(scanForActivity(_context).getFragmentManager(), "TAG");
                }
            }
            return true;
        }
    
        @Override
        public void setAdapter(SpinnerAdapter adapter) {
    
            if (!_isFromInit) {
                _arrayAdapter = (ArrayAdapter) adapter;
                if (!TextUtils.isEmpty(_strHintText) && !_isDirty) {
                    ArrayAdapter arrayAdapter = new ArrayAdapter(_context, android.R.layout
                            .simple_list_item_1, new String[]{_strHintText});
                    super.setAdapter(arrayAdapter);
                } else {
                    super.setAdapter(adapter);
                }
    
            } else {
                _isFromInit = false;
                super.setAdapter(adapter);
            }
        }
        //The method just below is executed  when an item in the searchlist is tapped.This is where we store the value int string called selectedItem.
        @Override
        public void onSearchableItemClicked(Object item, int position) {
            setSelection(_items.indexOf(item));
    
            if (!_isDirty) {
                _isDirty = true;
                setAdapter(_arrayAdapter);
                setSelection(_items.indexOf(item));
            }
            selectedItem= item.toString().trim();
            Adddata.setValueSt(selectedItem);
    
    //        Toast.makeText(getContext(),"You selected "+selectedItem, Toast.LENGTH_LONG).show();
        }
    
    
    
        private Activity scanForActivity(Context cont) {
            if (cont == null)
                return null;
            else if (cont instanceof Activity)
                return (Activity) cont;
            else if (cont instanceof ContextWrapper)
                return scanForActivity(((ContextWrapper) cont).getBaseContext());
    
            return null;
        }
    
        @Override
        public int getSelectedItemPosition() {
            if (!TextUtils.isEmpty(_strHintText) && !_isDirty) {
                return NO_ITEM_SELECTED;
            } else {
                return super.getSelectedItemPosition();
            }
        }
    
        @Override
        public Object getSelectedItem() {
            if (!TextUtils.isEmpty(_strHintText) && !_isDirty) {
                return null;
            } else {
    
                return super.getSelectedItem();
            }
        }
    }
    

    上面的代码工作正常,但我需要在运行时更改数组。数组在xml文件中声明,如此

    android:entries="@array/state"

    如何在运行时修改此数组?任何帮助都是有价值的。

    - !谢谢

3 个答案:

答案 0 :(得分:0)

创建字符串的数组列表

ArrayList<String> area = new ArrayList<>();

在区域arrayList中添加值

 area.add("value1");
 area.add("value2");

现在设置适配器

yourSpinner.setAdapter(new ArrayAdapter<String>(context
                            , android.R.layout.simple_list_item_1, area));

答案 1 :(得分:0)

Resources中声明的任何内容均无法在Runtime

处更改

您必须按java code

执行此操作

答案 2 :(得分:0)

创建ArrayList并插入您从API获取的条目或添加它。

    List < String > list = new ArrayList < > ();
    list.add("Male");
    list.add("Female");
    list.add("Others");
    ArrayAdapter < String > dataAdapter = new ArrayAdapter < String > (this, android.R.layout.simple_spinner_item, list);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerGender.setAdapter(dataAdapter);

    List<String> list= new ArrayList<>();
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerGender.setAdapter(dataAdapter);
    onResposeSucessofAPI(List<String> list){
         this.list = list;
         dataAdapter.notifyDataSetChanged();
    }