Created
November 1, 2017 06:45
-
-
Save sreelallalu/0ed8afe6b66b992529e7b72b422a3523 to your computer and use it in GitHub Desktop.
SearchableSpinner
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<declare-styleable name="SearchableSpinner"> | |
<attr name="hintText" format="string"/> | |
<attr name="hintTextColor" format="color"/> | |
</declare-styleable> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
initilize | |
------------------> | |
country_spinner = (SearchableSpinner) findViewById(R.id.country_spinner); | |
adapter setting | |
------------------------> | |
_countryAdapter = new ArrayAdapter(this, | |
R.layout.simple_text, countryList); | |
country_spinner.setAdapter(_countryAdapter); | |
set view | |
---------------------> | |
country_spinner.setView(getPosition1(countryList, Contry_set)); | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class SearchableListDialog extends DialogFragment implements | |
SearchView.OnQueryTextListener, SearchView.OnCloseListener { | |
private static final String ITEMS = "items"; | |
private ArrayAdapter listAdapter; | |
private ListView _listViewItems; | |
private SearchableItem _searchableItem; | |
private OnSearchTextChanged _onSearchTextChanged; | |
private SearchView _searchView; | |
private String _strTitle; | |
private int lngType; | |
private boolean mandatory; | |
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); | |
//TODO custom setting---> | |
String strPositiveButton = _strPositiveButtonText == null ? lngType==0?"CLOSE":"റദ്ദാക്കുക" : _strPositiveButtonText; | |
alertDialog.setPositiveButton(strPositiveButton, _onClickListener); | |
String strTitle = _strTitle == null ? "Select" : _strTitle; | |
alertDialog.setTitle(mandatory?MandStar.star(strTitle):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,int position,boolean mandatory) { | |
_strTitle = strTitle; | |
lngType=position; | |
this.mandatory=mandatory; | |
} | |
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.spinner_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.spinner_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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 int _strHintTextColor; | |
private boolean _isFromInit; | |
private Spinner spinner; | |
private String _hint; | |
private int langType; | |
private boolean mandatory; | |
public SearchableSpinner(Context context) { | |
super(context); | |
// this._arrayAdapter=new ArrayAdapter(this._context, R.layout.simple_text, new String[]{_strHintText}); | |
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) { | |
// String []arry=a.getString(attr); | |
_strHintText = a.getString(attr); | |
_strHintText = getHintValue(_strHintText); | |
// _strHintTextColor = a.getColor(attr); | |
} | |
} | |
a.recycle(); | |
init(); | |
} | |
//TODO custom setting---> | |
private String getHintValue(String _strHintText) { | |
SharedPreferences sharedPreferences = _context.getSharedPreferences(GlobalVal.sharedpreferncename, MODE_PRIVATE); | |
String lang = sharedPreferences.getString("LANG", "ENG"); | |
langType = lang.equals("ENG") ? 0 : 1; | |
//langType = 1; | |
String value = "Select"; | |
if (_strHintText.equals("state")) { | |
mandatory = true; | |
value = langType == 0 ? "Select State" : "സംസ്ഥാനം തിരഞ്ഞെടുക്കുക"; | |
} else if (_strHintText.equals("country")) { | |
mandatory = true; | |
value = langType == 0 ? "Residing Country" : "താമസിക്കുന്ന രാജ്യം"; | |
} else if (_strHintText.equals("district")) | |
{ | |
mandatory = true; | |
value = langType == 0 ? "Select District" : "ജില്ല തിരഞ്ഞെടുക്കുക"; | |
} else if (_strHintText.equals("state2")) | |
{ | |
mandatory = true; | |
value = langType == 0 ? "Select State" : "സംസ്ഥാനം തിരഞ്ഞെടുക്കുക"; | |
} | |
else if (_strHintText.equals("nearest")) | |
{ | |
mandatory = true; | |
value = langType == 0 ? "Select Nearest Meeting Location" : "പങ്കെടുക്കുന്ന സ്ഥലം"; | |
} | |
return value; | |
} | |
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); | |
setTitle(_strHintText, langType, mandatory); | |
_arrayAdapter = (ArrayAdapter) getAdapter(); | |
if (!TextUtils.isEmpty(_strHintText)) { | |
List<String> value = new ArrayList<>(); | |
value.add(0, _strHintText); | |
AdapterHint _arrayAdapter = new AdapterHint(_context, value, mandatory); | |
_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) { | |
List<String> value = new ArrayList<>(); | |
value.add(0, _strHintText); | |
AdapterHint _arrayAdapter = new AdapterHint(_context, value, mandatory); | |
super.setAdapter(_arrayAdapter); | |
} else { | |
super.setAdapter(_arrayAdapter); | |
} | |
} 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, int position, boolean mandatory) { | |
_searchableListDialog.setTitle(strTitle, position, mandatory); | |
} | |
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(); | |
} | |
} | |
public void setView(int i) { | |
try { | |
setSelection(i); | |
if (!_isDirty) { | |
_isDirty = true; | |
setAdapter(_arrayAdapter); | |
setSelection(i); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<com.departments.norkaroots.SearchSpinner.SearchableSpinner | |
android:layout_gravity="center" | |
android:id="@+id/country_spinner" | |
app:hintText="country" | |
app:hintTextColor="#fff" | |
android:backgroundTint="#fff" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
> | |
</com.departments.norkaroots.SearchSpinner.SearchableSpinner> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment