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 ().