Filtro de adaptador personalizado IndexOutOfBoundsException
Soy principiante en android.
Mi adaptador personalizado causa excepción al filtrar.
- ¿Cómo configurar un filtro de color para XWalkView? (Resuelto)
- Filtro de pantalla de brillo
- Sólo orientar dispositivos de alta resolución (píxeles) en Android Market
- Filtro de video de Android
- Filtro de mercado para clase de memoria
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 ()
- Agregue un filtro de búsqueda en RecyclerView con tarjetas?
- Cómo reemplazar MultiAutoCompleteTextView lista desplegable
- Efectos secundarios de cambiar el filtro y los requisitos de una aplicación existente en Android Play / Market
- Cómo parar toast & alertDialog perder el foco en mi filtro EditText
- Android - Enmascarar un mapa de bits con otro mapa de bits
- Cómo hacer que mi aplicación de Android aparezca en la lista compartida de otra aplicación específica
- Android ColorFilter - Modos de Porter-Duff
- Se comprueba un elemento incorrecto al filtrar ListView en android
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; }
- De repente, la hormiga / carpeta no aparece en el SDK de Android. Google lo eliminó?
- ¿Cómo puedo inhabilitar todos los eventos táctiles en todos los niños de un ViewGroup?