I\'m developing an Android application. I have my activity here with some widgets including a Spinner. I want that Spinner object to be searchable using the quick search but
I know this question is old, but today i also needed this function, and because I wasn´t able to find anything, i made myself a adapter for those spinner
The Adapter:
public class Searchspinner extends ArrayAdapter {
private LayoutInflater inflater;
private boolean dropdown = false;
private OnClickListener onsearch;
private ActionBar ab;
private final ArrayList result = new ArrayList();
private InputMethodManager keyboard;
private boolean searching = false;
public Searchspinner(Context context, int resource,
ArrayList objects, LayoutInflater l, ActionBar a,
InputMethodManager imm, String spinnerid) {
super(context, resource, objects);
inflater = l;
ab = a;
keyboard = imm;
createSearch();
// TODO Auto-generated constructor stub
}
@Override
public View getDropDownView(int position, View cnvtView, ViewGroup prnt{
dropdown = true;
return getCustomView(position, cnvtView, prnt);
}
@Override
public View getView(int pos, View cnvtView, ViewGroup prnt) {
dropdown = false;
return getCustomView(pos, cnvtView, prnt);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
if (!dropdown) {
View mySpinner = inflater.inflate(
R.layout.spinner_ressource_search, parent, false);
TextView main_text = (TextView) mySpinner
.findViewById(R.id.tv_spinner_first);
main_text.setText(getItem(position));
ImageButton search = (ImageButton) mySpinner
.findViewById(R.id.searchbutton);
if (!searching) {
search.setImageResource(R.drawable.search);
} else {
search.setImageResource(R.drawable.search_check);
}
search.setOnClickListener(onsearch);
return mySpinner;
}
View mySpinner = inflater.inflate(R.layout.auftragtextview, parent,
false);
TextView sub_text = (TextView) mySpinner.findViewById(R.id.TextView01);
sub_text.setText(getItem(position));
return mySpinner;
}
private void createSearch() {
onsearch = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (searching) {
searching = false;
ab.setCustomView(R.layout.actionbar_layout);
ab.getCustomView().setTag("0");
keyboard.toggleSoftInput(0,
InputMethodManager.HIDE_IMPLICIT_ONLY);
for (int i = 0; i < result.size(); i++) {
add(result.get(i));
result.remove(i);
i--;
}
((ImageButton) v).setImageResource(R.drawable.search);
return;
}
((ImageButton) v).setImageResouce(R.drawable.search_check);
searching = true;
ab.setCustomView(R.layout.searchable);
final EditText et = (EditText) ab.getCustomView()
.findViewById(R.id.editText1);
et.setActivated(true);
keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
0);
et.requestFocus();
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
for (int i = 0; i < getCount(); i++) {
if (!getItem(i).contains(s)) {
result.add(getItem(i));
remove(getItem(i));
i--;
}
}
for (int i = 0; i < result.size(); i++) {
if (result.get(i).toLowerCase()
.contains(s.toString().toLowerCase())) {
add(result.get(i));
result.remove(i);
i--;
}
}
}
@Override
public void beforeTextChanged(CharSequence s,
int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}
};
}
}
The spinner_ressource_search.xml:
and the auftragtextview.xml:
and this is how you create the Adapter:
Searchspinner auftragSpinnerAdapter = new Searchspinner(
this.getApplicationContext(),
R.layout.auftragtextview,
list_auftragSpinner,getLayoutInflater(),
getActionBar(),
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)
);
I hope this is going to help anybody, and that i haven´t missed a already build in way to do this :D
Greetings
Edit:
The searcheble.xml
So the EditText1 is just a simple editText in The View that get´s in the Actionbar when you search.
The ActionbarLayout is the normal ActionbarView.