La eliminación de elementos ListView cambia la altura de los elementos
Tengo un ListView
cuyos artículos se pueden suprimir golpeándolos. Cuando se pasa un elemento, su fila de base de datos se elimina, así como su objeto en el conjunto de datos del adaptador, y notifyDataSetChanged()
se llama. El problema es que estos elementos tienen diferentes alturas – uno puede ser un solo forro, el segundo puede tener cuatro líneas. Así que cuando tengo algunos elementos en la lista, digamos:
1.Una línea
- EditText en ListView necesita ajustarResize pero tiene error de foco perdidoso
- Cómo deshabilitar el menú contextual para determinados elementos ListView en Android
- Checkbox auto call onCheckedChange cuando se desplaza el listview?
- Bad convertView type BaseAdapter de ListView
- Cómo quitar el divisor inferior del pie de página en una vista de lista de android
2. Dos líneas
3.Tres líneas
4.Una línea
Y el segundo es eliminado, el tercero va en su lugar (como se esperaba), pero se corta a dos líneas. Y cuando se elimina el tercero, se aumenta la altura del cuarto elemento para que coincida con el elemento eliminado.
He encontrado una manera de arreglarlo, sin embargo es probablemente una equivocada – crea una nueva vista incluso si un convertView no es nulo.
Me pregunto si esto se puede lograr de otra manera, reciclable.
Código del adaptador de corriente:
public class CounterItemAdapter extends BaseAdapter{ private Activity activity; private ArrayList<CounterItem> data; private SQLiteOpenHelper helper; private static LayoutInflater inflater = null; public CounterItemAdapter(Activity activity, ArrayList<CounterItem> data, SQLiteOpenHelper helper) { this.activity = activity; this.data = data; this.helper = helper; inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return data.size(); } @Override public CounterItem getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return getItem(position).getId(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; //if(convertView == null) view = inflater.inflate(R.layout.counter_list_item, null); TextView nameView = (TextView)view.findViewById(R.id.nameView); //other, unrelated views were here final CounterItem counterItem; counterItem = getItem(position); nameView.setText(counterItem.getName()); return view; } }
- Establecer color del área 'vacío' de ListView en Android
- Desplazamiento en listview con altura de celda diferente
- Animación de encabezados de un ListView dando ClassCastException
- Temas de Android ListView
- Diferente posición z para los elementos ListView
- Mostrando un botón de eliminación en el desplazamiento de un listview para Android
- Lista y lista de adaptadores para mostrar json
- Buggy ListView me hace triste
De acuerdo, he encontrado una solución.
Añadido int lastValidPosition = -1;
en el adaptador, entonces adapter.lastValidPosition = position-1
en el método de devolución de llamada de eliminación, antes de adapter.notifyDataSetChanged();
, y en el método getView()
del adaptador que he cambiado
//if(convertView == null) view = inflater.inflate(R.layout.counter_list_item, null);
a
if(lastValidPosition < position | convertView == null){ view = inflater.inflate(R.layout.counter_list_item, null); lastValidPosition = position; }
y funciona perfectamente.