Filtering a Custom Adapter IndexOutOfBoundsException

I am new to android.

My custom adapter throws an exception while filtering.

here is my code. private class DeptAdapter extends ArrayAdapter implements Filterable {

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 +")" ; } } 

help me to anyone .... I can't understand why the getView () method was called more than items.size ()

+8
android filter custom-adapter
source share
4 answers

Keep in mind that getView() will ask for the size of the elements that superclass has, which right now is what you originally passed to it when you called the superclass constructor,

 super(context, textViewResourceId, items); 

Therefore, the superclass does not know that you resized while filtering. This means that getCount() will return the original size of the array, which, for obvious reasons, is larger than your filtered array.

This means that you must override the getCount() method to ensure that you are returning the actual actual size:

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

You must also override other methods associated with List operations (such as retrieving) if you intend to use them. For example:

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

You need to add these methods to improve performance:

  @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; } 
+1
source share

You are missing the getCount() method, see the demo

I hope this will be helpful!

0
source share
  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 } 
0
source share

All Articles