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

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; } } 

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.

  • CheckedTextView no marcado
  • Android personalizado ListView repite el fondo de selección
  • Recyclerview de Android vs ListView con el usuario
  • Función de desplazamiento de listview dentro de la vista de desplazamiento
  • Cómo agregar dos listview en scrollview
  • Listview en SwipeRefreshLayout - no muestra nada cuando el adaptador personalizado tiene sólo una fila para mostrar
  • OnLongClickListener nunca se trigered
  • Vista de lista de Android con secciones
  • Cómo crear ListView con la ayuda de remoteview?
  • No se pueden obtener contactos con cuentas de gmail sincronizadas
  • Cómo crear un listview expandible con encabezados de sección en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.