Estou curioso sobre o objetivo dos métodos getItem
e getItemId
na classe Adapter no Android SDK.
A partir da descrição, parece que getItem
deve retornar os dados subjacentes. Então, se eu tiver uma matriz de nomes ["cat","dog","red"]
e criar um adaptador a
usando isso, a.getItem(1)
retornarei "dog", correto? O que deve a.getItemId(1)
retornar?
Se você usou esses métodos na prática, poderia dar um exemplo?
getItemId()
emArrayAdapter()
sempre retorna-1
comassert false : "TODO"; return -1;
Respostas:
Eu vejo esses métodos como uma abordagem mais limpa para acessar os dados da minha lista. Em vez de acessar diretamente o objeto do meu adaptador através de algo como
myListData.get(position)
eu posso simplesmente chamar o adaptador comoadapter.get(position)
.O mesmo vale para
getItemId
. Normalmente, eu usaria esse método quando desejar executar alguma tarefa com base no ID exclusivo de um objeto na lista. Isso é especialmente útil ao trabalhar com um banco de dados. O retornoid
pode ser uma referência a um objeto no banco de dados no qual eu poderia executar diferentes operações (atualização / exclusão / etc).Portanto, em vez de acessar o ID a partir do objeto de dados brutos, como
myListData.get(position).getId()
você pode usaradapter.getItemId(position)
.Um exemplo de onde eu senti que precisava usar esses métodos estava em um projeto usando o SeparatedListViewAdapter . Esse adaptador pode conter vários tipos diferentes de adaptadores, cada um representando dados de um tipo diferente (normalmente). Ao chamar
getItem(position)
oSeparatedListViewAdapter
, o objeto retornado pode ser diferente dependendo de qual "seção" a posição é que você o envia.Por exemplo, se você tinha 2 seções na sua lista (frutas e doces): Se você usou
getItem(position)
eposition
passou a ser em um item na fruta seção, você receberia um objeto diferente do que se solicitadogetItem(position)
composition
apontando para um item na doces seção. Você pode então retornar algum tipo de valor de ID constante nogetItemId(position)
qual representa que tipo de dadosgetItem(position)
está retornando ou usarinstanceof
para determinar qual objeto você possui.Além do que mencionei, nunca senti que realmente precisava usar esses métodos
fonte
getView
,getCount
,getViewTypeCount
, Etc são usados especificamente para mostrar corretamente seu UI listview. as outras funções simplesmente ajudam a criar implementar outras funcionalidades, tais como realização de novas acções ao clicar um item, etc., embora muitas vezes eu usogetItem
dentrogetView
getItemId
, basta retornar0L
ounull
não usá-lo em qualquer lugar. Não vejo nenhuma razão óbvia para que um UUID seja mais valioso do que apenas algumlong
valor para identificação. Modo desconectado? O que é isso?Bem, parece que essa pergunta poderia ser respondida de uma maneira mais simples e direta ... :-)
Simplificando, o Android permite anexar um
long
a qualquerListView
item, é simples assim. Quando o sistema notifica você sobre a seleção do usuário, você recebe três variáveis de identificação para informar o que foi selecionado:long
você anexou aos elementos individuais.Cabe a você decidir qual desses três é o mais fácil de lidar no seu caso particular, mas você tem todos os três para escolher o tempo todo. Pense nisso
long
como uma tag anexada automaticamente ao item, apenas que é ainda mais simples e fácil de ler.O mal-entendido sobre o que geralmente faz decorre de uma simples convenção. Todos os adaptadores precisam fornecer um
getItemId()
mesmo que não usem essa terceira identificação. Portanto, por convenção, esses adaptadores (incluindo muitos exemplos no SDK ou em toda a Web) simplesmente retornamposition
por um único motivo: é sempre único. Ainda assim, se um adaptador retornarposition
, isso realmente significa que ele não deseja usar esse recurso, poisposition
já é conhecido.Portanto, se você precisar retornar qualquer outro valor que achar conveniente, sinta-se à vontade para fazê-lo:
fonte
getItemId()
... O que acontece quando / se esse método não é substituído no seu adaptador personalizado?O
getItemId
método foi amplamente projetado para trabalhar com cursores suportados por bancos de dados SQLite. Ele retornará o campo de identificação do cursor subjacente para o item na posição 1.No seu caso, não há um ID para o item na posição 1: estou assumindo que a implementação do ArrayAdapter retorne -1 ou 0.
EDIT: na verdade, apenas retorna a posição: neste caso
1
.fonte
-1
. Aqui está a implementaçãoassert false : "TODO"; return -1;
Gostaria de mencionar que após a implementação
getItem
egetItemId
você pode usar o ListView.getItemAtPosition e o ListView.getItemIdAtPosition para acessar diretamente os dados, em vez de passar pelo adaptador. Isso pode ser particularmente útil ao implementar um ouvinte onClick.fonte
Se você implementar
getItemId
corretamente, pode ser muito útil.Exemplo:
Você tem uma lista de álbuns:
E você implementa
getItemId
assim:Agora, o ID do seu item depende dos valores dos campos coverUrl e title e, se você alterar e ligar
notifyDataSetChanged()
para o adaptador, o adaptador chamará o método getItemId () de cada elemento e atualizará apenas os itens cujo ID foi alterado.Isso é muito útil se você estiver executando algumas operações "pesadas" no seu
getView()
.BTW: se você quiser que isso funcione, você precisa garantir que seu
hasStableIds()
método retorne false;fonte
hasStableIds()
retornar falso? Parece-me que o código hash calculado a partir da mesma string retornaria o mesmo valor toda vez, o que é um ID estável de acordo com os documentos .getItem
ougetItemId
há poucos métodos projetados principalmente para anexar dados com itens da lista. No caso degetItem
, você pode passar qualquer objeto que será anexado ao item na lista. Normalmente as pessoas retornamnull
.getItemId
é qualquerlong
valor exclusivo que você pode anexar com o mesmo item na lista. As pessoas geralmente retornam a posição na lista.Qual o uso. Bem, como esses valores estão vinculados ao item da lista, você pode extraí-los quando o usuário clicar no item. Esses valores são acessíveis através de
AdapterView
métodos.fonte