Skip to content

Instantly share code, notes, and snippets.

@amirul12
Forked from sreelallalu/MainActivity
Created February 15, 2021 12:08
Show Gist options
  • Save amirul12/1f1489b3d8f689903405e835802c3689 to your computer and use it in GitHub Desktop.
Save amirul12/1f1489b3d8f689903405e835802c3689 to your computer and use it in GitHub Desktop.
SearchableSpinner
<declare-styleable name="SearchableSpinner">
<attr name="hintText" format="string"/>
<attr name="hintTextColor" format="color"/>
</declare-styleable>
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));
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);
}
}
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();
}
}
}
<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