Tengo curiosidad sobre el propósito de los métodos getItem
y getItemId
en la clase Adaptador en el SDK de Android.
De la descripción, parece que getItem
debería devolver los datos subyacentes. Entonces, si tengo una serie de nombres ["cat","dog","red"]
y creo un adaptador a
con eso, entonces a.getItem(1)
debería devolver "dog", ¿correcto? ¿Qué debería a.getItemId(1)
volver?
Si ha utilizado estos métodos en la práctica, ¿podría dar un ejemplo?
getItemId()
enArrayAdapter()
vuelve siempre-1
conassert false : "TODO"; return -1;
Respuestas:
Veo estos métodos como un enfoque más limpio para acceder a los datos de mi lista. En lugar de acceder directamente a mi objeto adaptador a través de algo como
myListData.get(position)
, simplemente puedo llamar al adaptador comoadapter.get(position)
.Lo mismo vale para
getItemId
. Por lo general, usaría este método cuando quiero ejecutar alguna tarea basada en la ID única de un objeto en la lista. Esto es especialmente útil cuando se trabaja con una base de datos. El devueltoid
podría ser una referencia a un objeto en la base de datos en el que luego podría realizar diferentes operaciones (actualizar / eliminar / etc.).Entonces, en lugar de acceder a la ID desde el objeto de datos sin procesar como
myListData.get(position).getId()
puede usaradapter.getItemId(position)
.Un ejemplo de donde sentí que necesitaba usar estos métodos fue en un proyecto usando SeparatedListViewAdapter . Este adaptador puede contener múltiples tipos diferentes de adaptadores, cada uno representando datos de un tipo diferente (típicamente). Al llamar
getItem(position)
alSeparatedListViewAdapter
, el objeto devuelto puede ser diferente dependiendo de qué "sección" es la posición en la que lo envía.Por ejemplo, si usted tenía 2 secciones de la lista (frutas y dulces): Si ha utilizado
getItem(position)
yposition
pasó a ser en un elemento de la fruta de la sección, que recibiría un objeto diferente que si usted solicitógetItem(position)
conposition
que apunta a un elemento en el caramelo sección. Luego, puede devolver algún tipo de valor de ID constante en elgetItemId(position)
que represente qué tipo de datosgetItem(position)
están regresando, o usarinstanceof
para determinar qué objeto tiene.Aparte de lo que he mencionado, nunca sentí que realmente necesitaba usar estos métodos
fuente
getView
,getCount
,getViewTypeCount
, Etc se utilizan específicamente para mostrar correctamente la interfaz de usuario de lista. las otras funciones simplemente ayudan a crear, implementar otras funcionalidades, como realizar acciones adicionales al hacer clic en un elemento, etc., aunque a menudo lo usogetItem
dentrogetView
getItemId
, solo regrese0L
onull
no lo use en ningún lado. No veo ninguna razón obvia por la que un UUID sea más valioso que solo unlong
valor para la ID. Modo desconectado? ¿Que es eso?Bueno, parece que esta pregunta podría responderse de una manera más simple y directa ... :-)
En pocas palabras, Android le permite adjuntar un
long
a cualquierListView
elemento, es así de simple. Cuando el sistema le notifica la selección del usuario, recibe tres variables de identificación para decirle qué se seleccionó:long
lo adjuntaste a los elementos individuales.Depende de usted decidir cuál de estos tres es el más fácil de manejar en su caso particular, pero tiene los tres para elegir todo el tiempo. Piense en esto
long
como una etiqueta adjunta automáticamente al elemento, solo que es aún más simple y fácil de leer.El malentendido sobre lo que suele hacer se deriva de una simple convención. Todos los adaptadores deben proporcionar
getItemId()
incluso si realmente no usan esta tercera identificación. Entonces, por convención, esos adaptadores (incluidos muchos en muestras en el SDK o en toda la web) simplemente regresanposition
por una sola razón: siempre es única. Aún así, si un adaptador regresaposition
, esto realmente significa que no quiere usar esta característica, ya que deposition
todos modos ya se sabe.Por lo tanto, si necesita devolver cualquier otro valor que le parezca, no dude en hacerlo:
fuente
getItemId()
... ¿Qué sucede cuando / si este método no se anula en su adaptador personalizado?El
getItemId
método está diseñado en gran medida para trabajar con cursores respaldados por bases de datos SQLite. Devolverá el campo de identificación del cursor subyacente para el elemento en la posición 1.En su caso, no hay una identificación para el elemento en la posición 1: supongo que la implementación de ArrayAdapter solo devuelve -1 o 0.
EDITAR: en realidad, solo devuelve la posición: en este caso
1
.fuente
-1
. Aquí está la implementaciónassert false : "TODO"; return -1;
Me gustaría mencionar que después de implementar
getItem
ygetItemId
que puedo utilizar ListView.getItemAtPosition y ListView.getItemIdAtPosition para acceder directamente a sus datos, en lugar de ir a través del adaptador. Esto puede ser particularmente útil al implementar un oyente onClick.fuente
Si implementa
getItemId
correctamente, puede ser muy útil.Ejemplo:
Tienes una lista de álbumes:
Y lo implementas
getItemId
así:Ahora su ID de elemento depende de los valores de los campos coverUrl y title y si cambia luego y llama
notifyDataSetChanged()
a su adaptador, entonces el adaptador llamará al método getItemId () de cada elemento y actualizará solo los elementos cuyo ID ha cambiado.Esto es muy útil si está haciendo algunas operaciones "pesadas" en su
getView()
.Por cierto: si desea que esto funcione, debe asegurarse de que su
hasStableIds()
método devuelva falso;fuente
hasStableIds()
devolver falso? Me parece que el código hash calculado a partir de la misma cadena devolvería el mismo valor cada vez, que es una ID estable según los documentos .getItem
ogetItemId
son pocos métodos diseñados principalmente para adjuntar datos con elementos en la lista. En caso degetItem
, puede pasar cualquier objeto que se adjuntará al elemento en la lista. Normalmente la gente regresanull
.getItemId
es cualquierlong
valor único que puede adjuntar con el mismo elemento en la lista. Las personas generalmente devuelven el puesto en la lista.Cual es el uso. Bueno, como estos valores están vinculados al elemento de la lista, puede extraerlos cuando el usuario hace clic en el elemento. Estos valores son accesibles a través de
AdapterView
métodos.fuente