0

Я работаю на андроиде проект, где у меня есть 2 пользовательского кокКак изменить андроид: записи список массива в блеснах динамически в Android

  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"

Как я могу изменить этот массив во время выполнения? Любая помощь была бы ценной.

- Спасибо!

ответ

0

Создание Список_массивов цепочек

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

добавить значения в области Список_массивов

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

Теперь установите адаптер

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

Все объявленные в Resources, не может быть изменен в Runtime

Вы должны сделать это с помощью java code

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