I have implemented Search Filter to my SearchView in my SherlockAction Bar. I have Implemented a Custom Filter. When i type any letter i am getting an error
public class PlacesListAdapter extends ArrayAdapter<Place> implements
Filterable {
public Context mContext;
List<Place> mPlaces, orig;
public PlacesListAdapter(Context context, List<Place> places) {
super(context, R.layout.list_item_places, places);
// TODO Auto-generated constructor stub
this.mPlaces = places;
this.mContext = context;
orig = new ArrayList<Place>(places);
}
@Override
public Place getItem(int position) {
// TODO Auto-generated method stub
return mPlaces.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater viewInflater;
viewInflater = LayoutInflater.from(getContext());
convertView = viewInflater.inflate(R.layout.list_item_places, null);
holder = new ViewHolder();
holder.placeTitle = (TextView) convertView
.findViewById(R.id.place_title);
holder.placeDistance = (TextView) convertView
.findViewById(R.id.place_distance);
holder.placeCategoryIcon = (ImageView) convertView
.findViewById(R.id.place_category_icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.placeTitle.setText(mPlaces.get(position).getPlaceName());
holder.placeDistance.setText(mPlaces.get(position).getPlaceDistance());
holder.placeCategoryIcon
.setImageResource(R.drawable.icon_category_hillstation);
// // Setting Alternative Row Colors
if (position % 2 == 0) {
convertView
.setBackgroundResource(R.drawable.list_view_places_row_1);
} else {
convertView
.setBackgroundResource(R.drawable.list_view_places_row_2);
}
return convertView;
}
static class ViewHolder {
TextView placeId;
TextView placeTitle;
TextView placeDistance;
ImageView placeCategoryIcon;
}
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return new PlaceFilter();
}
private class PlaceFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint){
FilterResults oReturn = new FilterResults();
ArrayList<Place> results = new ArrayList<Place>();
if (orig == null)
orig = mPlaces;
if (constraint != null) {
if (orig != null && orig.size() > 0) {
for (Place g : orig) {
if (g.getPlaceName()
.toLowerCase()
.startsWith(constraint.toString().toLowerCase()))
results.add(g);
}
}
oReturn.values = results;
}
return oReturn;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
mPlaces = (ArrayList<Place>) results.values;
notifyDataSetChanged();
}
}
}
ERROR
12-26 17:24:43.900: E/AndroidRuntime(18693): FATAL EXCEPTION: main
12-26 17:24:43.900: E/AndroidRuntime(18693): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
12-26 17:24:43.900: E/AndroidRuntime(18693): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
12-26 17:24:43.900: E/AndroidRuntime(18693): at java.util.ArrayList.get(ArrayList.java:304)
12-26 17:24:43.900: E/AndroidRuntime(18693): at com.m7.nomad.PlacesListAdapter.getView(PlacesListAdapter.java:68)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.AbsListView.obtainView(AbsListView.java:2193)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.ListView.makeAndAddView(ListView.java:1774)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.ListView.fillDown(ListView.java:672)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.ListView.fillSpecific(ListView.java:1330)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.ListView.layoutChildren(ListView.java:1603)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.AbsListView.onLayout(AbsListView.java:2044)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:925)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1628)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2585)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.os.Handler.dispatchMessage(Handler.java:99)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.os.Looper.loop(Looper.java:137)
12-26 17:24:43.900: E/AndroidRuntime(18693): at android.app.ActivityThread.main(ActivityThread.java:4507)
12-26 17:24:43.900: E/AndroidRuntime(18693): at java.lang.reflect.Method.invokeNative(Native Method)
12-26 17:24:43.900: E/AndroidRuntime(18693): at java.lang.reflect.Method.invoke(Method.java:511)
12-26 17:24:43.900: E/AndroidRuntime(18693): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
12-26 17:24:43.900: E/AndroidRuntime(18693): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
12-26 17:24:43.900: E/AndroidRuntime(18693): at dalvik.system.NativeStart.main(Native Method)
Error
Its pointing to
holder.placeTitle.setText(mPlaces.get(position).getPlaceName());
If you debug, you'll see that mPlaces.getSize()
equals 1, and trying to access the item in position 1, you'll get an ArrayOutOfBounds
exception.
there is something wrong in your ArrayList and it probably doesn't have all the data you are trying to get.