Android: Accede a vistas secundarias desde una vista de lista


Necesito averiguar la posición de píxel de un elemento en una lista que se ha mostrado usando un ListView. Parece que debería obtener uno de los TextView y luego usar getTop(), pero no puedo averiguar cómo obtener una vista hija de un ListView.

Actualización: Los hijos de ViewGroup no corresponden 1 a 1 con los elementos de la lista, para un ListView. En cambio, los hijos de ViewGroup corresponden solo a aquellas vistas que son visibles en este momento. Así que getChildAt() opera en un índice que es interno al ViewGroup y no necesariamente tiene nada que ver con la posición en la lista que usa el ListView.

Author: N J, 2008-11-03

6 answers

Ver: Android ListView: obtener el índice de datos del elemento visible y combinar con parte de la respuesta de los pies de arriba, puede darle algo como:

int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
  Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
  return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);

El beneficio es que no está iterando sobre los hijos de ListView, lo que podría tener un impacto en el rendimiento.

 214
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:53

Este código es más fácil de usar:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }
 17
Author: Kalimah Apps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-31 00:26:35

Una búsqueda rápida de los documentos para la clase ListView ha mostrado los métodos getChildCount() y getChildAt() heredados de ViewGroup. ¿Puedes iterar a través de ellos usando estos? No estoy seguro, pero vale la pena intentarlo.

Lo encontré aquí

 6
Author: Feet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-02 23:04:55
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

  @Override
public void onItemClick(AdapterView<?> parent, final View view, int position, long   id) 
{       
    View v; 
    int count = parent.getChildCount();
    v =parent.getChildAt(position);
    parent.requestChildFocus(v, view);  v.setBackground(res.getDrawable(R.drawable.transparent_button));
            for (int i=0; i<count; i++)
            {
                if (i!= position)
                {
                    v = parent.getChildAt(i);t  v.setBackground(res.getDrawable(R.drawable.not_clicked));

                }
            }
        }
    });

Básicamente, cree dos elementos de diseño: uno que sea transparente y otro que sea del color deseado. Solicite el foco en la posición pulsada (posición int como se define) y cambie el color de dicha fila. Luego, camine por el padre listview y cambie todas las demás filas en consecuencia. Esto tiene en cuenta cuando un usuario hace clic en listview varias veces. Esto se hace con un diseño personalizado para cada fila en el listview. (Muy simple, solo un nuevo archivo de diseño con un textview - no establecer enfocable o clickable!) No se requiere adaptador personalizado-utilice el adaptador de matriz

 5
Author: Wes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-07 06:55:36
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
 4
Author: Milaaaad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-29 08:11:43

Esto supone que conoce la posición del elemento en la vista de lista:

  View element = listView.getListAdapter().getView(position, null, null);

Entonces deberías poder llamar a getLeft() y getTop() para determinar la posición de los elementos en la pantalla.

 -9
Author: jasonhudgins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-04 14:08:27