A veces listView.getChildAt (int index) devuelve NULL (Android)
Tengo un listView con un adaptador de encargo. Cuando algo sucede (un clic en un niño) Hago algunas cosas de cálculo y modificar el niño Ver. SI se ha cumplido alguna condición, se debe modificar otro niño no relacionado con el niño que ha hecho clic.
Esto a veces funciona, pero a veces falla y el DDMS dice que la vista es nula …
- Ampliar / reducir en webview android
- No se puede establecer ExpandableListView Child DividerHeight
- ¿Hay una manera de desplazarse mediante programación una vista de desplazamiento a un texto de edición específico?
- ExpandableListView con arrastrar y soltar de elementos de la lista en Android
- El vídeo no se reproduce correctamente en el listview de android
Déjame mostrarte el código:
if(invalidaEste != -1) { try { View v = lv_data.getChildAt(invalidaEste); if( v== null) { Log.e("MY_LOG", "SIZE " + lv_data.getCount()); Log.e("MY_LOG", "IS_NULL " + String.valueOf(invalidaEste)); } if(invalidaEste >= lv_data.getFirstVisiblePosition() && invalidaEste <= lv_data.getLastVisiblePosition()) { RelacionFacturaPago rpf = (RelacionFacturaPago)lv_data.getAdapter().getItem(invalidaEste); TextView tv = (TextView)v.findViewById(R.id.tv_pendiente); tv.setText(Formato.double2Screen(rpf.getPorPagar())); } } catch (Exception e) { Log.e("MY_LOG", "FAIL"); Log.e("MY_LOG", String.valueOf(invalidaEste)); } }
InvalidaEste es la vista que quiero modificar. Cuando v es nulo , registro el índice para comprobar si está bien. Siempre es menor o igual que el listView.getCount ()
¿Por qué está pasando esto?
Más datos: El código está dentro de la onAnimationStart (animación de animación) de un listener AnimationListener.
- Cómo hacer un Scroll Listener para WebView en Android
- Recepción de la barra de estado oculta / entrada de un evento de actividad de pantalla completa en un servicio
- Adición dinámica de vistas a RelativeLayout dentro de ScrollView
- ExpandableListView no aparece cuando se inicia la actividad
- Vista superficial en capas en un FrameLayout en Android
- ¿Cómo crear una vista personalizada simple?
- ICS Spinner ("desplegable" en lugar de diálogo) en versiones anteriores de Android
- Android Cómo obtener una vista previa de una imagen, utilizando su ruta de acceso desde SDcard, desde mi aplicación
Debido al reciclado de vista, listView.getChildAt()
sólo devolverá una vista para las posiciones que está mostrando, y tal vez una más. Tal vez si comparte más de su código podemos ayudarle a averiguar cómo abordar mejor el problema.
Dmon y Azertiti son correctos … una vez que su lista se desplaza usted se encuentra en problemas. Si la vista no es visible, entonces no existe (es decir, ha sido reciclada por Android). Volverá a crear la vista una vez que se despliegue.
Hacer algo como esto debería funcionar:
View view; int nFirstPos = lv_data.getFirstVisiblePosition(); int nWantedPos = invalidaEste - nFirstPos; if ((nWantedPos >= 0) && (nWantedPos <= lv_data.getChildCount()) { view = lv_data.getChildAt(nWantedPos); if (view == null) return; // else we have the view we want }
Si ese niño no es visible en la pantalla, significa que no hay vista para ello. Creo que este no es tu caso de trabajo.
Una buena práctica es cambiar los datos detrás de su adaptador de lista y llamar a notifyDataSetChanged () en el adaptador. Esto informará a la lista que el adaptador ha cambiado y vuelva a pintar las vistas.
Si realmente desea actualizar manualmente la vista, supongo que la única solución es retener los nuevos valores en algún lugar y esperar hasta que la vista se vuelva visible. En ese momento usted tiene una referencia válida y puede hacer las actualizaciones.
Lo pruebo con una línea de código cuando necesito ir dentro de una posición válida de un Listview. Aquí están sus variables usadas como un ejemplo. Donde lv_data es el ListView y tv es tu TextView.
if ( lv_data.getChildAt(lv_data.getPositionForView(tv)) != null) { int position = lv_data.getPositionForView(tv); }
- Problemas de procesamiento No se pudo resolver resource @ id / search_edit_frame
- Error en el manifiesto después de actualizar a android studio 1.4