过滤自定义适配器IndexOutOfBoundsException

我是android的新手。

过滤时,我的自定义适配器导致exception

这是我的代码。 私人类DeptAdapter扩展ArrayAdapter实现可筛选{

private ArrayList<Dept> items; private ArrayList<Dept> mOriginalValues; public DeptAdapter(Context context, int textViewResourceId, ArrayList<Dept> items) { super(context, textViewResourceId, items); this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.item_listview_2line, null); } Dept d = items.get(position); if (d != null) { TextView tt = (TextView) v.findViewById(R.id.toptext); TextView bt = (TextView) v.findViewById(R.id.bottomtext); if (tt != null){ tt.setText(d.dept_nm); } if(bt != null){ bt.setText(d.dept_cd); } } return v; } @Override public Filter getFilter() { Filter filter = new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint,FilterResults results) { items = (ArrayList<Dept>) results.values; // has the filtered values if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values ArrayList<Dept> FilteredArrList = new ArrayList<Dept>(); if (mOriginalValues == null) { mOriginalValues = new ArrayList<Dept>(items); // saves the original data in mOriginalValues } if (constraint == null || constraint.length() == 0) { // set the Original result to return results.count = mOriginalValues.size(); results.values = mOriginalValues; } else { constraint = constraint.toString().toLowerCase(); for (int i = 0; i < mOriginalValues.size(); i++) { Dept d = mOriginalValues.get(i); if (d.dept_cd.toLowerCase().startsWith(constraint.toString()) || d.dept_nm.toLowerCase().startsWith(constraint.toString())) { FilteredArrList.add(d); } } // set the Filtered result to return results.count = FilteredArrList.size(); results.values = FilteredArrList; } return results; } }; return filter; } } class Dept { String dept_cd; String dept_nm; public Dept(String dept_cd, String dept_nm) { this.dept_cd = dept_cd; this.dept_nm = dept_nm; } public String toString() { return this.dept_nm+ "(" + this.dept_cd +")" ; } } 

帮助我的人….我不明白为什么getView()方法被调用更多然后items.size()

Solutions Collecting From Web of "过滤自定义适配器IndexOutOfBoundsException"

请记住, getView()将查询superclass具有的项目的大小,现在它是调用超类构造函数时最初传递的项目的大小,

 super(context, textViewResourceId, items); 

因此,超类不知道在过滤之后已经改变了大小。 这意味着getCount()将返回数组的原始大小,这比你的过滤数组大。

这意味着您应该重写getCount()方法,以确保您返回实际的有效大小:

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

如果要使用它们,还应该重写与List操作相关的其他方法(如获取)。 例如:

 @Override public Dept getItem (int pos){ return items.get(pos); } 

您需要添加此方法以获得更好的性能:

  @Override public int getCount() { return items.size(); } @Override public Object getItem(int position) { return this.items.get(position); } @Override public long getItemId(int position) { return position; } 

你缺lessgetCount()方法,看看这个演示

我希望这会有所帮助!

  private ArrayList<Dept> items; private ArrayList<Dept> mOriginalValues; public DeptAdapter(Context context, int textViewResourceId, ArrayList<Dept> items) { super(context, textViewResourceId, items); this.items = items; this.mOriginalValues=items; //add this line in your code }