Obtener altura de ListView después de setadapter
Bueno, estoy tratando de obtener mi altura listview después de cambiar los datos, pero siempre devolver la altura anterior, no la actual.
Así que cuando establezco el setadapter, y obtener el valor antiguo. p.ej:
- Máscara ImageView con fondo de esquina redonda
- SearchView en ActionBar - problemas con el botón * Up *
- Divisor ListView para Android
- ListView scrollbarStyle con margen / relleno
- Vista de lista con elementos de vista personalizados con superposiciones parciales (Android)
ActualHeight = 100 Change data (filter) -> NewHeight = 60 ListView.GetHeight still returns 100. Again ActualHeight = 60 Change data (filter) -> NewHeight = 20 ListView.GetHeight still returns 60.
El código que estoy usando es:
int width, height = 0; EditText edt_search; ListView lv_marca; List<Marca> list_marca = new ArrayList<Marca>(); List<Marca> list_marca_search = new ArrayList<Marca>(); String text = edt_search.getText().toString(); list_marca_search.clear(); if(text.startsWith(".")){ text = text.replace(".", ""); for (Marca m : list_marca) { if (String.valueOf(m.getCd_marca()).equals(text)){ list_marca_search.add(m); } } } else { for (Marca m : lista_marca) { if (m.getDs_marca().contains(text)){ list_marca_search.add(m); } } } ArrayAdapter<Marca> adapter_marca = new CustomAdapter_Marca(MyDialog.this, R.layout.layout_consulta_estoque_marca_lista, list_marca_search); lv_marca.setAdapter(adapter_marca); int height_window = getWindowManager().getDefaultDisplay().getHeight(); height = lv_marca.getHeight() + getSupportActionBar().getHeight(); if (height >= height_window) { height = (int) (height_window * 0.95); } getWindow().setLayout(width, height);
- Android: Autocompletar TextView similar a la aplicación de Facebook
- Cajón de navegación Elementos que no registran el evento de clic
- Actualización de textview en la actividad una vez que se cambian los datos en la clase de adaptador
- Android ListView no resalta cuando se establece OnClickListener
- Android cursorLoader con paginación o carga más funcionalidad?
- Cajón de navegación Cambia el fondo mientras se desplaza
- Implementación de un "más rápido" backToTop - ListView
- Los resultados de RecyclerView + Glide resultan en un lío
Ok, encontré la solución.
Cuando cambio el SetAdapter en mi ListView consigo la altura de la medida que significa una línea, y multiplique por los números de línea más la altura del divisor por los números de línea también.
He aquí un ejemplo de cómo lo hice, no sé si es la mejor manera, pero funciona perfectamente ^^:
ListView lv_marca; lv_marca.setAdapter(adapter_marca); int list_height = getListViewHeight(lv_marca); private int getListViewHeight(ListView list) { ListAdapter adapter = list.getAdapter(); int listviewHeight = 0; list.measure(MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); listviewHeight = list.getMeasuredHeight() * adapter.getCount() + (adapter.getCount() * list.getDividerHeight()); return listviewHeight; }
Tendrá que agregar un OnHierarchyChangeListener
a su listview para que pueda obtener el valor de la nueva altura de la vista de lista cuando se agreguen o eliminen elementos secundarios de la lista:
lv_marca.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() { @Override public void onChildViewRemoved(View parent, View child) { // This will give you the height when your new adapter contains // lesser number of items than the previous one int heightAfterItemRemoved=parent.getHeight(); Log.i("list_view_height_change","Height after removing item : "+heightAfterItemRemoved); } @Override public void onChildViewAdded(View parent, View child) { // This will give you the height when your new adapter contains // greater number of items than the previous one int heightAfterItemAdded=parent.getHeight(); Log.i("list_view_height_change","Height after adding item : "+heightAfterItemAdded); } });
Hay una captura – esto sólo funcionará si la propiedad 'layout_height' de la vista de lista está establecida en 'wrap_content'. En este caso, la altura de la vista de lista aumenta o disminuye a medida que se agregan o eliminan elementos, respectivamente. La altura de la vista de lista alcanza el valor máximo cuando la vista de lista está completamente llena. Si agrega más elementos a la vista de lista, se desbordará y se desplazará, pero el valor de altura no cambiará, ya que ya ocupa la altura máxima permitida dentro de su vista principal.
Si establece 'layout_height' en 'fill_parent' o 'match_parent', la vista de lista ocupará la altura máxima permitida dentro de su vista primaria desde el principio y, por lo tanto, eliminar o agregar elementos a ella no dará lugar a ningún cambio en su altura .
- Cómo comprobar si se inició IntentService
- Obtener mensajes de la bandeja de entrada desde el dispositivo Android para mostrarlo en el listview personalizado