2011-03-25 17 views
8

Tengo dos ListViews (A y B) con elementos del mismo tipo (una clase I creada)¿Cómo obtener la vista de un elemento ListView?

Cuando hago clic en un elemento desde A, agrega este objeto en B y si vuelvo a hacer clic lo quita . Solo cuando se selecciona un elemento, cambio su fondo usando view.setBackgroundColor (myColor).

Quiero ser capaz de eliminar el elemento de la lista B (funciona), pero también quiero restablecer el color de fondo. No puedo entender cómo obtener la vista de este artículo que estoy eliminando.

¿Alguna idea?

+0

Si usted nos muestra algunos de su código (la parte pertinente), será mucho más fácil para ayudarle. – Phonon

+0

Olvidé mencionar que utilizo pestañas para alternar entre las listas. En cuanto al código, no hay mucho más complicado, amplié ArrayAdapters, y onClick utilizo view.setBackgroundColor (myColor) – Lucas

Respuesta

10

No hay garantía de que un elemento específico de ListView tenga una vista en un momento dado. Si el elemento está actualmente fuera de la pantalla, es posible que no tenga una vista. Dado que un elemento específico podría no tener una vista, podría no tener sentido intentar obtener la vista del elemento.

Más allá de eso, debido a la forma en que ListView crea y reutiliza las vistas, verá algunos efectos extraños e indeseables si simplemente modifica las vistas directamente. A medida que el usuario se desplaza por la lista, los elementos que se vuelven visibles terminarán de forma incorrecta con los mismos fondos que otros elementos que han caído fuera de la parte visible.

No sé si lo que sigue es la mejor manera de implementar su funcionalidad porque no sé el costo de reconstruir la lista después de un cambio. Esta es la forma (probablemente ingenua) Me gustaría hacer esto:

  1. Agregar otro miembro booleano a su objeto de datos, algo así como isInSecondList.
  2. Anule getView() en el adaptador. En getView(), establezca el fondo como normal o resaltado según el valor del artículo isInSecondList.
  3. Cuando se agrega o elimina un elemento de la segunda lista, actualice el objeto de datos para reflejar el cambio, luego llame al notifyDataSetChanged() del Adaptador.
+0

Hola, no me desagrada la solución. Solo que no fui lo suficientemente claro, tal vez tendrá algo que agregar si le digo que utilicé una única TabActivity que contiene las dos listas. – Lucas

+0

No agregué el booleano, en su lugar, verifiqué si la lista contiene el objeto. En cuanto a los pasos 2 y 3, hice lo que sugirió y funciona perfectamente. ¡Gracias! – Lucas

+0

Creo que la respuesta número 3 es la mejor manera de obtener vista en la vista de lista – Milaaaad

5
int position = 0; 
listview.setItemChecked(position, true); 
View wantedView = adapter.getView(position, null, listview); 
+0

SÍ, es una buena forma de obtener la vista base de posición de la vista de lista en android gracias, pruebo 10 o más, pero su mejor – Milaaaad

0

Esto es lo que hice

private View oldSelection; 

@Override 
public void onItemClick(AdapterView<?> arg0, View view, int position, 
     long arg3) { 
     highlightSelectdListItem(position); 
} 

    public void highlightSelectdListItem(int position) { 
    clearPreviousSelection(); 
    View newsItemView = mGridVIew.getChildAt(position); 
    oldSelection = newsItemView; 
    newsItemView.setBackgroundColor(Color.GRAY); 
    } 


public void clearPreviousSelection() { 
    if (oldSelection != null) { 
     oldSelection.setBackgroundColor(Color.TRANSPARENT); 
    } 

} 
+0

no funciona a causa de apagado -la vista de lista de la pantalla, por ejemplo, cuando toco el 50º elemento por el elemento, haga clic en colocar este código return ** nulo ** ---> 'Ver newsItemView = mGridVIew.getChildAt (posición);' es debido a que la lista ver calcular la posición desde la parte superior del elemento visto en la pantalla no en la lista – Milaaaad

Cuestiones relacionadas