Filtro de adaptador personalizado IndexOutOfBoundsException

Soy principiante en android.

Mi adaptador personalizado causa excepción al filtrar.

Aquí está mi código. Private class DeptAdapter extends ArrayAdapter implements Filtrado {

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 anyone …. No puedo entender por qué el método getView () fue invocado más entonces items.size ()

Tenga en cuenta que getView() consultará el tamaño de los elementos que tiene la superclass , que ahora mismo, es lo que originalmente pasó al llamar al constructor de la superclase,

 super(context, textViewResourceId, items); 

Por lo tanto, la superclase no sabe que ha cambiado el tamaño cuando se filtró. Esto significa que getCount() devolverá el tamaño original de la matriz, que es comprensiblemente más grande que su matriz filtrada.

Esto significa que debe anular el método getCount() para estar seguro de que está devolviendo el tamaño válido:

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

También debe anular los otros métodos relacionados con las operaciones de Lista (como obtener) si va a utilizarlos. P.ej:

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

Te falta el método getCount() , mira esta demostración

Espero que sea util !

  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 } 

Debe agregar estos métodos para obtener un mejor rendimiento:

  @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; } 
  • Publicar varias versiones de una aplicación en Google Market
  • Android Análisis de señal y algunos filtros
  • Excluir Nexus 7 de dispositivos compatibles
  • Cómo filtrar texto en un ListView correctamente?
  • Filtro de vista de lista Android
  • Android - Implementación del filtro de búsqueda en un RecyclerView
  • ¿Cómo uso AutoCompleteTextView y lo relleno con datos de una API web?
  • Cómo aplicar un filtro de color a una vista con todos los niños
  • Filtrado del objeto Realm en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.