2017-04-18 94 views
-2

我想用Gridview创建一个searchView!我用了几个教程来实现,并能实现这一目标。但是当我进入3个字符应用强行关闭..GridView过滤器中的IndexOutOfBoundsException错误

我的适配器代码:

public class CountryViewAdapter extends ArrayAdapter<GridItem> implements Filterable { 

    private Context mContext; 
    private int layoutResourceId; 
    private ArrayList<GridItem> mGridData = new ArrayList<GridItem>(); 
    private ArrayList<GridItem> filerlist = new ArrayList<GridItem>(); 
    CustomFilter filter; 
    private InputStream mInputStream; 
    public CountryViewAdapter(Context mContext, int layoutResourceId, ArrayList<GridItem> mGridData) { 
     super(mContext, layoutResourceId, mGridData); 
     this.layoutResourceId = layoutResourceId; 
     this.mContext = mContext; 
     this.mGridData = mGridData; 
     this.filerlist = mGridData; 
    } 


    /** 
    * Updates grid data and refresh grid items. 
    * @param mGridData 
    */ 
    public void setGridData(ArrayList<GridItem> mGridData) { 
     this.mGridData = mGridData; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ViewHolder holder; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 
      holder = new ViewHolder(); 
      holder.titleTextView = (TextView) row.findViewById(R.id.grid_item_title); 
      //holder.imageView = (ImageView) row.findViewById(R.id.grid_item_image); 
      holder.cimageView = (CircleImageView)row.findViewById(R.id.grid_item_image); 
      row.setTag(holder); 
     } else { 
      holder = (ViewHolder) row.getTag(); 
     } 
     GridItem item = mGridData.get(position); 
     holder.titleTextView.setText(Html.fromHtml(item.getTitle())); 
     Log.e(item.getTitle(),Constants.BASE_URL_IMAGE+item.getImage()+".png"); 
     String imageid = item.getId(); 
     imageid = imageid.toLowerCase(); 
      Picasso.with(mContext).load("http://52.221.44.206/mobeeload/countries/png250px/"+imageid+".png").error(R.drawable.mobeeloadicon).into(holder.cimageView); 
    return row; 
    } 
    public static boolean exists(String URLName){ 
     try { 
      HttpURLConnection.setFollowRedirects(false); 
      // note : you may also need 
      //  HttpURLConnection.setInstanceFollowRedirects(false) 
      HttpURLConnection con = 
        (HttpURLConnection) new URL(URLName).openConnection(); 
      con.setRequestMethod("HEAD"); 
      return (con.getResponseCode() == HttpURLConnection.HTTP_OK); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 
    public String checkImageUri(String uri) { 
     String val = "false"; 
     try { 
      mInputStream = mContext.getContentResolver().openInputStream(Uri.parse(uri)); 
      val = "true"; 
     } catch (FileNotFoundException e) { 
      Log.e("GIfImageView", "File not found"); 
      val="false"; 
     } 
     return val; 
    } 
    static class ViewHolder { 
     TextView titleTextView; 
     ImageView imageView; 
     CircleImageView cimageView; 
    } 

    public Filter getFilter(){ 
     if(filter == null){ 
      filter = new CustomFilter(); 
     } 
     return filter; 
    } 
    class CustomFilter extends Filter{ 

     @Override 
     protected FilterResults performFiltering(CharSequence contraints) { 
      GridItem item; 
      FilterResults results = new FilterResults(); 
      if(contraints!= null && contraints.length() > 0){ 
       contraints = contraints.toString().toUpperCase(); 
       ArrayList<GridItem> filters = new ArrayList<GridItem>(); 
       Log.e("SIZE",String.valueOf(filerlist.size())); 
       for(int i=0;i<filerlist.size();i++){ 
        if(filerlist.get(i).getTitle().toUpperCase().contains(contraints)){ 
         Log.e("TITLE = ",filerlist.get(i).getTitle().toUpperCase()); 
         item = new GridItem(); 
         item.setId(filerlist.get(i).getId()); 
         item.setTitle(filerlist.get(i).getTitle()); 
         item.setImage(filerlist.get(i).getImage()); 
         filters.add(item); 
        } 
       } 
       results.count = filters.size(); 
       results.values = filters; 
      } 
      else{ 
       results.count = filerlist.size(); 
       results.values = filerlist; 
      } 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence contraints, FilterResults result) { 
      mGridData = (ArrayList<GridItem>) result.values; 
      notifyDataSetChanged(); 
     } 
    } 
} 

我的错误日志是:

FATAL EXCEPTION: main 
                    Process: in.juasoft.mobeeload, PID: 7185 
                    java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3 
                     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
                     at java.util.ArrayList.get(ArrayList.java:308) 
                     at in.juasoft.mobeeload.CountryViewAdapter.getView(CountryViewAdapter.java:69) 
                     at android.widget.AbsListView.obtainView(AbsListView.java:2347) 
                     at android.widget.GridView.makeAndAddView(GridView.java:1433) 
                     at android.widget.GridView.makeRow(GridView.java:361) 
                     at android.widget.GridView.fillDown(GridView.java:302) 
                     at android.widget.GridView.fillSpecific(GridView.java:582) 
                     at android.widget.GridView.layoutChildren(GridView.java:1287) 
                     at android.widget.AbsListView.onLayout(AbsListView.java:2151) 
                     at android.view.View.layout(View.java:15685) 
                     at android.view.ViewGroup.layout(ViewGroup.java:5039) 
                     at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077) 
                     at android.view.View.layout(View.java:15685) 
                     at android.view.ViewGroup.layout(ViewGroup.java:5039) 
                     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
                     at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
                     at android.view.View.layout(View.java:15685) 
                     at android.view.ViewGroup.layout(ViewGroup.java:5039) 
                     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 
                     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 
                     at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 
                     at android.view.View.layout(View.java:15685) 
                     at android.view.ViewGroup.layout(ViewGroup.java:5039) 
                     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
                     at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
                     at android.view.View.layout(View.java:15685) 
                     at android.view.ViewGroup.layout(ViewGroup.java:5039) 
                     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 
                     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 
                     at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 
                     at android.view.View.layout(View.java:15685) 
                     at android.view.ViewGroup.layout(ViewGroup.java:5039) 
                     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
                     at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
                     at android.view.View.layout(View.java:15685) 
                     at android.view.ViewGroup.layout(ViewGroup.java:5039) 
                     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2125) 
                     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1882) 
                     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1099) 
                     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5952) 
                     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:794) 
                     at android.view.Choreographer.doCallbacks(Choreographer.java:607) 
                     at android.view.Choreographer.doFrame(Choreographer.java:577) 
                     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:780) 
                     at android.os.Handler.handleCallback(Handler.java:739) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:135) 
                     at android.app.ActivityThread.main(ActivityThread.java:5290) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at java.lang.reflect.Method.invoke(Method.java:372) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:911) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706) 

,一切工作正常。但是,当3个字符的搜索查看正在进入它力与此错误关闭......请帮助我..

UPDATE

终于发现问题: 我忘了在适配器中添加下面的方法。

@Override 
    public int getCount(){ 
     return mGridData.size(); 
    } 

    @Override 
    public GridItem getItem(int pos){ 
     return mGridData.get(pos); 
    } 


    @Override 
    public long getItemId(int pos){ 
     return mGridData.indexOf(getItem(pos)); 
    } 

无论如何感谢您的建议和帮助!

+0

它表示大小为3,所请求的索引也为3.数组列表以0开头,所以最大索引将是2,如果大小为3 –

+0

显然这是如何结束扩展'ArrayAdapter'没有正确knowladge ...很明显'getCount'返回初始项计数...这显然会导致调用'getView'位置超出界限过滤项目 – Selvin

回答

1

某处在你的代码你调用此方法

getView(int position, View convertView, ViewGroup parent)

与无效的位置。 从堆栈跟踪看到此错误:

Invalid index 3, size is 3 

我的猜测是,mGridData有三个要素,但你用的3一个位置的地方调用这个方法:

GridItem item = mGridData.get(position); 

记住数组索引从零开始,因此最大可能位置为mGridData.size() - 1,在这种情况下为2