我在SherlockAction酒吧实现搜索过滤器,我的搜索查看。 我实现了自定义过滤器。当我输入任何字母,我得到一个错误
公共类PlacesListAdapter扩展ArrayAdapter<地方>器物
可过滤{
公共语境mContext;
名单<地方> mPlaces,原稿;
公共PlacesListAdapter(上下文的背景下,名单,其中,地方>地方){
超(背景下,R.layout.list_item_places,地方);
// TODO自动生成构造函数存根
this.mPlaces =场所;
this.mContext =背景;
原稿=新的ArrayList<地方>(地方);
}
@覆盖
公共场所的getItem(INT位置){
// TODO自动生成方法存根
返回mPlaces.get(位置);
}
@覆盖
众长getItemId(INT位置){
返回的位置;
}
@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
ViewHolder持有人;
如果(convertView == NULL){
LayoutInflater viewInflater;
viewInflater = LayoutInflater.from(的getContext());
convertView = viewInflater.inflate(R.layout.list_item_places,NULL);
持有人=新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(保持器);
} 其他 {
支架=(ViewHolder)convertView.getTag();
}
holder.placeTitle.setText(mPlaces.get(位置).getPlaceName());
holder.placeDistance.setText(mPlaces.get(位置).getPlaceDistance());
holder.placeCategoryIcon
.setImageResource(R.drawable.icon_category_hillstation);
// //设置备用行颜色
如果(位置%2 == 0){
convertView
.setBackgroundResource(R.drawable.list_view_places_row_1);
} 其他 {
convertView
.setBackgroundResource(R.drawable.list_view_places_row_2);
}
返回convertView;
}
静态类ViewHolder {
TextView的placeId;
TextView的placeTitle;
TextView的placeDistance;
ImageView的placeCategoryIcon;
}
@覆盖
公共过滤用getFilter(){
// TODO自动生成方法存根
返回新PlaceFilter();
}
私有类PlaceFilter扩展过滤器{
@覆盖
保护FilterResults performFiltering(CharSequence的约束){
FilterResults oReturn =新FilterResults();
ArrayList的<地方>结果=新的ArrayList<地方>();
如果(原稿== NULL)
原稿= mPlaces;
如果(约束!= NULL){
如果(原稿=空&安培;!&安培;原稿尺寸()大于0){
对于(地点G:原稿){
如果(g.getPlaceName()
.toLowerCase()
.startsWith(constraint.toString()。与toLowerCase()))
results.add(G);
}
}
oReturn.values =结果;
}
返回oReturn;
}
@覆盖
保护无效publishResults(CharSequence的约束,
FilterResults结果){
mPlaces =(ArrayList的<地方>)results.values;
notifyDataSetChanged();
}
}
}
错误
12-26 17:24:43.900:E / AndroidRuntime(18693):致命异常:主要
12-26 17:24:43.900:E / AndroidRuntime(18693):java.lang.IndexOutOfBoundsException:无效索引1,大小为1
12-26 17:24:43.900:E / AndroidRuntime(18693):在java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
12-26 17:24:43.900:E / AndroidRuntime(18693):在java.util.ArrayList.get(ArrayList.java:304)
12-26 17:24:43.900:E / AndroidRuntime(18693):在com.m7.nomad.PlacesListAdapter.getView(PlacesListAdapter.java:68)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.AbsListView.obtainView(AbsListView.java:2193)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.ListView.makeAndAddView(ListView.java:1774)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.ListView.fillDown(ListView.java:672)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.ListView.fillSpecific(ListView.java:1330)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.ListView.layoutChildren(ListView.java:1603)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.AbsListView.onLayout(AbsListView.java:2044)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.View.layout(View.java:11418)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.RelativeLayout.onLayout(RelativeLayout.java:925)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.View.layout(View.java:11418)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.FrameLayout.onLayout(FrameLayout.java:431)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.View.layout(View.java:11418)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.LinearLayout.onLayout(LinearLayout.java:1399)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.View.layout(View.java:11418)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.widget.FrameLayout.onLayout(FrameLayout.java:431)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.View.layout(View.java:11418)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1628)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2585)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.os.Handler.dispatchMessage(Handler.java:99)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.os.Looper.loop(Looper.java:137)
12-26 17:24:43.900:E / AndroidRuntime(18693):在android.app.ActivityThread.main(ActivityThread.java:4507)
12-26 17:24:43.900:E / AndroidRuntime(18693):在java.lang.reflect.Method.invokeNative(本机方法)
12-26 17:24:43.900:E / AndroidRuntime(18693):在java.lang.reflect.Method.invoke(Method.java:511)
12-26 17:24:43.900:E / AndroidRuntime(18693):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:790)
12-26 17:24:43.900:E / AndroidRuntime(18693):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
12-26 17:24:43.900:E / AndroidRuntime(18693):在dalvik.system.NativeStart.main(本机方法)
错误
它指向
holder.placeTitle.setText(mPlaces.get(位置).getPlaceName());
解决方案
如果您调试,你会看到 mPlaces.getSize()
等于1,并试图访问在位置1的项目,你会得到一个 ArrayOutOfBounds
例外。
有什么错在你的ArrayList和它可能不具有的所有数据,你试图让。
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.