有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

searchview Android IndexOutOfBoundsException搜索筛选列表视图错误

我已经在我的SherlockAction栏中为我的SearchView实现了搜索过滤器。 我已经实现了一个自定义过滤器。我打任何一封信都会出错

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();
        }

    }

}

错误

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 安卓.widget.AbsListView.obtainView(AbsListView.java:2193)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.ListView.makeAndAddView(ListView.java:1774)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.ListView.fillDown(ListView.java:672)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.ListView.fillSpecific(ListView.java:1330)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.ListView.layoutChildren(ListView.java:1603)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.AbsListView.onLayout(AbsListView.java:2044)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.RelativeLayout.onLayout(RelativeLayout.java:925)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.FrameLayout.onLayout(FrameLayout.java:431)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.LinearLayout.layoutVertical(LinearLayout.java:1486)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.LinearLayout.onLayout(LinearLayout.java:1399)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.widget.FrameLayout.onLayout(FrameLayout.java:431)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.View.layout(View.java:11418)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.ViewGroup.layout(ViewGroup.java:4224)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1628)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2585)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.os.Handler.dispatchMessage(Handler.java:99)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.os.Looper.loop(Looper.java:137)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:557)
12-26 17:24:43.900: E/AndroidRuntime(18693):    at dalvik.system.NativeStart.main(Native Method)

错误

它指向

holder.placeTitle.setText(mPlaces.get(position).getPlaceName());

共 (4) 个答案

  1. # 1 楼答案

    如果有人需要进入您的活动的自定义操作栏(或在本例中是ListFragment)中的SearchView代码,请参阅:

        ActionBar actionBar = getActivity().getActionBar();
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME);
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setCustomView(R.layout.your_bar);
        SearchView groupSV = (SearchView)actionBar.getCustomView().findViewById(R.id.groupSV);
        groupSV.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText) {
                Log.d(TAG,"onQueryTextChange");
                ListViewFragment.adapter.getFilter().filter(newText);
                return true;
            }
            @Override
            public boolean onQueryTextSubmit(String query) {
                Log.d(TAG,"onQueryTextSubmit");
                //ListViewFragment.adapter.getFilter().filter(query);
                return true;
            }
        });
    

    您需要在ListViewFragment中将适配器声明为静态:

    public static ArrayAdapter<Your_obj> adapter = null;
    
    public class ListViewFragment extends ListFragment implements OnItemClickListener {
        //...//
    }
    

    此外,确保从OP的链接中查看其编辑的代码:PASTEBIN EDITS

  2. # 2 楼答案

    如果调试,您将看到mPlaces.getSize()等于1,并且尝试访问位置1中的项,您将得到一个ArrayOutOfBounds异常

    你的ArrayList有问题,可能没有你想要的所有数据

  3. # 3 楼答案

    尽量覆盖这一行

    holder.placeTitle.setText(mPlaces.get(position).getPlaceName());
    

    *出现以下情况*

    if(position < mPlaces.size() && holder.placeTitle != null)
      holder.placeTitle.setText(mPlaces.get(position).getPlaceName());
    

    编辑:

    以下是我的小片段:

    @Override
            public View getView(int position, View convertView, ViewGroup parent) {
    
                ViewHolder holder;
    
                if (convertView == null) {
                    LayoutInflater viewInflater;
                    viewInflater = getLayoutInflater();
                    convertView = viewInflater.inflate(R.layout.listview, null);
    
                    holder = new ViewHolder();
                    convertView.setTag(holder);
    
                } else {
                    holder = (ViewHolder) convertView.getTag();
    
                    // Try here first
                    holder.textview = (TextView) convertView.findViewById(R.id.TextView01);
                    holder.imageview = (ImageView) convertView.findViewById(R.id.ImageView01);
                }
    
                // Try here second
                // holder.textview = (TextView)convertView.findViewById(R.id.TextView01);
                // holder.imageview = (ImageView)convertView.findViewById(R.id.ImageView01);
    
                if (holder.textview != null && position < data_text.length)
                    holder.textview.setText(data_text[position]);
                if (holder.imageview != null && position < data_image.length)
                    holder.imageview.setImageResource(data_image[position]);
    
                return convertView;
            }
    

    可以用变量替换它

    谢谢

  4. # 4 楼答案

    在你的应用程序中尝试此代码

    if (g.getPlaceName().toLowerCase().contains(constraint.toString().toLowerCase())){
        results.add(g);
    }