How to use SearchView.OnQueryTextListener () in a search spinner?

I am creating a search counter using a third-party library. I added library classes (SearchableListDialog, SearchableSpinner) in my application. Everything works fine, but there is still one problem that I encountered, for example, in widget widgets, if I search for Abc, I do not get the result filtered as Abc, but when I click on the list items, the results show the element as Abc. This is similar to changing the position for items, but the list does not show the search result. I do not understand where I am mistaken. I modified the code several times, but did not get the desired result.

enter image description here

Spinner xml searchable code:

<com.example.my.currencyconverterapp.activity.SearchableSpinner android:id="@+id/spinner" android:layout_below="@+id/rl_currency_converterted_data" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

This is my snippet code where I install the adapter for the search.

 countriesCustomAdapterInr = new CountriesCustomAdapterInr(getActivity(), R.layout.custom_spinner_items, arrayList,res); spinner.setAdapter(countriesCustomAdapterInr); assert spinner != null; spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { Toast.makeText(getActivity(), ""+arrayList.get(i).getFull_name()+i, Toast.LENGTH_LONG).show(); } @Override public void onNothingSelected(AdapterView<?> adapterView) {} }); 

This is a third-party SearchableSpinner class:

 public class SearchableSpinner extends android.support.v7.widget.AppCompatSpinner implements View.OnTouchListener, SearchableListDialog.SearchableItem { public static final int NO_ITEM_SELECTED = -1; private Context _context; private List _items; private SearchableListDialog _searchableListDialog; private boolean _isDirty; private ArrayAdapter _arrayAdapter; private String _strHintText; private boolean _isFromInit; public SearchableSpinner(Context context) { super(context); this._context = context; init(); } public SearchableSpinner(Context context, AttributeSet attrs) { super(context, attrs); this._context = context; TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SearchableSpinner); final int N = a.getIndexCount(); for (int i = 0; i < N; ++i) { int attr = a.getIndex(i); if (attr == R.styleable.SearchableSpinner_hintText) { _strHintText = a.getString(attr); } } a.recycle(); init(); } public SearchableSpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this._context = context; init(); } private void init() { _items = new ArrayList(); _searchableListDialog = SearchableListDialog.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); } } @Override public void onSearchableItemClicked(Object item, int position) { setSelection(_items.indexOf(item)); if (!_isDirty) { _isDirty = true; setAdapter(_arrayAdapter); setSelection(_items.indexOf(item)); } } public void setTitle(String strTitle) { _searchableListDialog.setTitle(strTitle); } public void setPositiveButton(String strPositiveButtonText) { _searchableListDialog.setPositiveButton(strPositiveButtonText); } public void setPositiveButton(String strPositiveButtonText, DialogInterface.OnClickListener onClickListener) { _searchableListDialog.setPositiveButton(strPositiveButtonText, onClickListener); } public void setOnSearchTextChangedListener(SearchableListDialog.OnSearchTextChanged onSearchTextChanged) { _searchableListDialog.setOnSearchTextChangedListener(onSearchTextChanged); } 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(); } } } 

This is a third-party SearchableListDialog class:

 public class SearchableListDialog extends DialogFragment implements SearchView.OnQueryTextListener, SearchView.OnCloseListener { private static final String ITEMS = "items"; private CountriesCustomAdapterInr listAdapter; private ListView _listViewItems; private SearchableItem _searchableItem; private OnSearchTextChanged _onSearchTextChanged; private SearchView _searchView; private String _strTitle; private String _strPositiveButtonText; private DialogInterface.OnClickListener _onClickListener; public SearchableListDialog() { } public static SearchableListDialog newInstance(List items) { SearchableListDialog multiSelectExpandableFragment = new SearchableListDialog(); 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 Country" : _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.setQueryHint("Search Country"); _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); listAdapter = new CountriesCustomAdapterInr(getActivity(), R.layout.custom_spinner_items, arrayList, getResources()); // //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); } } 

Here, OnQueryTextListener () is not working fine. Please help me. I tried, but did not decide. Can someone help me please. Above, I mentioned my request. Thanks

+7
android listview searchview android-arrayadapter android-spinner
source share
2 answers

Instead of using Spinner with SearchView, I would suggest you achieve this with ListView and SearchView, I tried it and it works very well.

Put a button in your activity. Now clicking this button will open a user dialog.

enter image description here

Your custom_dialog.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.SearchView android:id="@+id/searchView" android:layout_width="match_parent" android:layout_height="wrap_content" /> <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

Then set the onClick button and do the following.

  @Override public void onClick(View view) { Dialog dialog = new Dialog(SearchText.this); LayoutInflater inflater = LayoutInflater.from(SearchText.this); View view1 = inflater.inflate(R.layout.custom_search_layout, null); ListView listView = view1.findViewById(R.id.listView); SearchView searchView = view1.findViewById(R.id.searchView); final ArrayAdapter<String> stringArrayAdapter = new ArrayAdapter<String>(SearchText.this, android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.my_currency)); listView.setAdapter(stringArrayAdapter); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String newText) { return false; } @Override public boolean onQueryTextChange(String newText) { stringArrayAdapter.getFilter().filter(newText); return false; } }); dialog.setContentView(view1); dialog.show(); } 

enter image description here

Now do your search and add OnItemClickListener to your list and do whatever you want after choosing your choice.

enter image description here

+2
source share

you can search in your adapter ... I did not see your adapter you can see my adapter https://github.com/kenmeidearu/SearchableSpinner/blob/master/searchablespinnerlibrary/src/main/java/com/kenmeidearu/searchablespinnerlibrary/ListAdapterSpinner .java

I will give you an example

-one
source share

All Articles