Tengo curiosidad sobre el propósito de los métodos getItemy getItemIden la clase Adaptador en el SDK de Android.
De la descripción, parece que getItemdebería devolver los datos subyacentes. Entonces, si tengo una serie de nombres ["cat","dog","red"]y creo un adaptador acon 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-1conassert 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 devueltoidpodrí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)ypositionpasó a ser en un elemento de la fruta de la sección, que recibiría un objeto diferente que si usted solicitógetItem(position)conpositionque 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 usarinstanceofpara 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 usogetItemdentrogetViewgetItemId, solo regrese0Lonullno lo use en ningún lado. No veo ninguna razón obvia por la que un UUID sea más valioso que solo unlongvalor 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
longa cualquierListViewelemento, 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ó:longlo 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
longcomo 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 regresanpositionpor 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 depositiontodos 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
getItemIdmé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
getItemygetItemIdque 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
getItemIdcorrectamente, puede ser muy útil.Ejemplo:
Tienes una lista de álbumes:
Y lo implementas
getItemIdasí: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 .getItemogetItemIdson 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.getItemIdes cualquierlongvalor ú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
AdapterViewmétodos.fuente