studio programacion para libros gratis edición desarrollo desarrollar aprende aplicaciones android listview children

android - programacion - Obtenga los niños ListView que no están a la vista



programacion android pdf 2018 (2)

Para una aplicación en la que estoy trabajando, estoy tratando de obtener los hijos de un ListView. Para ello tengo el siguiente código:

View listItem = mListView.getChildAt(i);

Sin embargo, esto solo funciona para los niños que están a la vista. Necesito llegar también a los niños que no están a la vista. ¿Cómo haría esto?

EDITAR:

Al comparar los métodos sugeridos con el que ya estaba usando, encuentro lo siguiente:

RelativeLayout listItem1 = (RelativeLayout) mListView.getAdapter().getView(i, null, mListView); RelativeLayout listItem2 = (RelativeLayout) mListView.getChildAt(i); Log.d("Checks", "listItem1: " + listItem1); Log.d("Checks", "listItem2: " + listItem2); 08-27 14:16:56.628: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c5f2920 08-27 14:16:56.628: D/Checks(15025): listItem2: android.widget.RelativeLayout@2c06d938 08-27 14:16:56.628: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c72dfb0 08-27 14:16:56.628: D/Checks(15025): listItem2: android.widget.RelativeLayout@2bfabe50 08-27 14:16:56.638: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c730c18 08-27 14:16:56.638: D/Checks(15025): listItem2: android.widget.RelativeLayout@2c0d3e38 08-27 14:16:56.638: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c12ebc0 08-27 14:16:56.638: D/Checks(15025): listItem2: android.widget.RelativeLayout@2bddbf70 08-27 14:16:56.648: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c131828 08-27 14:16:56.648: D/Checks(15025): listItem2: android.widget.RelativeLayout@2bdf3270 08-27 14:16:56.648: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c140de0 08-27 14:16:56.648: D/Checks(15025): listItem2: android.widget.RelativeLayout@2c0c8d30

listItem2 apunta a la vista real en el ListView, que es lo que quiero, excepto que solo funciona para las vistas que están a la vista. Puede ver en el archivo de registro que listItem1 y listItem2 no corresponden.

EDIT 2:

Se me ocurrió lo siguiente:

for (int i = 0; i < mListView.getCount(); i++) { RelativeLayout listItem = (RelativeLayout) mListView.getAdapter().getView(i, mListView.getChildAt(i), mListView); }

Esto devuelve las vistas correctamente para todos los elementos visibles en la lista. Sin embargo, devuelve una Vista diferente para los que no están a la vista.

EDITAR 3:

Gracias a nfirex tengo una respuesta de trabajo. Esto devolverá Vistas incluso si no están directamente a la vista:

public View getViewByPosition(int position, ListView listView) { final int firstListItemPosition = listView.getFirstVisiblePosition(); final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1; if (position < firstListItemPosition || position > lastListItemPosition ) { return listView.getAdapter().getView(position, listView.getChildAt(position), listView); } else { final int childIndex = position - firstListItemPosition; return listView.getChildAt(childIndex); } }


Necesitas el método Adapter.getView() :

final View view = mListView.getAdapter().getView(position, null, mListView);

ACTUALIZAR:

Necesitas crear tu método. Algo como esto:

public View getViewByPosition(int position, ListView listView) { final int firstListItemPosition = listView.getFirstVisiblePosition(); final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1; if (position < firstListItemPosition || position > lastListItemPosition ) { return listView.getAdapter().getView(position, null, listView); } else { final int childIndex = position - firstListItemPosition; return listView.getChildAt(childIndex); } }


Puedes usar este código

private static void initRecyclerBin(AbsListView view) { try { Field localField = AbsListView.class.getDeclaredField("mRecycler"); localField.setAccessible(true); Object recyclerBin = localField.get(view); Class<?> clazz = Class.forName("android.widget.AbsListView$RecycleBin"); Field scrapField = clazz.getDeclaredField("mScrapViews"); scrapField.setAccessible(true); ArrayList<View>[] scrapViews; scrapViews = (ArrayList<View>[]) scrapField.get(recyclerBin); if (null != scrapViews) { int length = scrapViews.length; for (int i = 0, count = 0; i < length; i++) { if (null != scrapViews[i] && !scrapViews[i].isEmpty()) { for (int j = 0; j < scrapViews[i].size(); j++) { scrapViews[i].get(j);//this is the scrapViews } } } } } catch (Exception e) { e.printStackTrace(); } }

y ListView getChildViews ().