I am building a sample app to demonstrate SearchView with filter and other Action Bar items. I am able to successfully run this app on 4.2(Nexus 7). But it is not running on 2.3. I googled about the issue. Came to know that i should use SherLock Action bar. I just went to http://actionbarsherlock.com/download.html, downloaded the zip file and added the library as informed in the video: http://www.youtube.com/watch?v=4GJ6yY1lNNY&feature=player_embedde by WiseManDesigns. But still I am unable to figure out the issue.
Here is my code:
SearchViewActionBar.java
public class SearchViewActionBar extends Activity implements SearchView.OnQueryTextListener
{
private SearchView mSearchView;
private TextView mStatusView;
int mSortMode = -1;
private ListView mListView;
private ArrayAdapter<String> mAdapter;
protected CharSequence[] _options = { "Wild Life", "River", "Hill Station", "Temple", "Bird Sanctuary", "Hill", "Amusement Park"};
protected boolean[] _selections = new boolean[ _options.length ];
private final String[] mStrings = Cheeses.sCheeseStrings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_main);
// mStatusView = (TextView) findViewById(R.id.status_text);
// mSearchView = (SearchView) findViewById(R.id.search_view);
mListView = (ListView) findViewById(R.id.list_view);
mListView.setAdapter(mAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
mStrings));
mListView.setTextFilterEnabled(true);
//setupSearchView();
}
private void setupSearchView() {
mSearchView.setIconifiedByDefault(true);
mSearchView.setOnQueryTextListener(this);
mSearchView.setSubmitButtonEnabled(false);
//mSearchView.setQueryHint(getString(R.string.cheese_hunt_hint));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.searchview_in_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) searchItem.getActionView();
//setupSearchView(searchItem);
setupSearchView();
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
if (mSortMode != -1)
{
Drawable icon = menu.findItem(mSortMode).getIcon();
menu.findItem(R.id.action_sort).setIcon(icon);
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
String c="Category";
String s=(String) item.getTitle();
if(s.equals(c))
{
System.out.println("same");
showDialog( 0 );
}
//System.out.println(s);
Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
protected Dialog onCreateDialog( int id )
{
return
new AlertDialog.Builder( this )
.setTitle( "Category" )
.setMultiChoiceItems( _options, _selections, new DialogSelectionClickHandler() )
.setPositiveButton( "SAVE", new DialogButtonClickHandler() )
.create();
}
public class DialogSelectionClickHandler implements DialogInterface.OnMultiChoiceClickListener
{
public void onClick( DialogInterface dialog, int clicked, boolean selected )
{
Log.i( "ME", _options[ clicked ] + " selected: " + selected );
}
}
public class DialogButtonClickHandler implements DialogInterface.OnClickListener
{
public void onClick( DialogInterface dialog, int clicked )
{
switch( clicked )
{
case DialogInterface.BUTTON_POSITIVE:
printSelectedPlanets();
break;
}
}
}
protected void printSelectedPlanets()
{
for( int i = 0; i < _options.length; i++ ){
Log.i( "ME", _options[ i ] + " selected: " + _selections[i] );
}
}
public void onSort(MenuItem item)
{
mSortMode = item.getItemId();
invalidateOptionsMenu();
}
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
mListView.clearTextFilter();
} else {
mListView.setFilterText(newText.toString());
}
return true;
}
public boolean onQueryTextSubmit(String query)
{
mStatusView.setText("Query = " + query + " : submitted");
return false;
}
public boolean onClose()
{
mStatusView.setText("Closed!");
return false;
}
protected boolean isAlwaysExpanded()
{
return false;
}
}
You need to use ActionBarSherlock. To do this your activity needs to extends and ActionBarSherlock component. Something more like this:
MySearchActivity extends SherlockActivity {}
or if you want to use the build in list API's you could just do this:
MySearchActivity extends SherlockListActivity {}
then in the res/menu folder create activity_mysearch.xml file with something like this in it:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_search"
android:icon="@drawable/ic_menu_search"
android:title="@string/menu_search"
android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="com.actionbarsherlock.widget.SearchView"
</menu>
Now have your activity implement OnQueryTextListener. In the onCreateOptionsMenu do:
inflater.inflate(R.menu.activity_mysearch, menu);
MenuItem searchViewMenuItem = menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView) searchViewMenuItem.getActionView();
searchView.setOnQueryTextListener(this);
You can now use the
onQueryTextSubmit(String query)
onQueryTextChange(String newText)
methods to query your list and update your list view item. You can also add a filter to the adapter and create an interface that notifies the activity to invalidate the list views after the adapter's data set has changed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With