Eu tenho um adaptador de lista personalizado:
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
no método 'getView' substituído, faço uma impressão para verificar qual é a posição e se é um convertView ou não:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
A saída disso (quando a lista é exibida pela primeira vez, nenhuma entrada do usuário ainda)
04-11 16:24:05.860: INFO/System.out(681): getView 0 null
04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8
04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8
04-11 16:25:50.251: INFO/System.out(681): getView 1 null
04-11 16:26:01.300: INFO/System.out(681): getView 2 null
04-11 16:26:02.020: INFO/System.out(681): getView 3 null
04-11 16:28:28.091: INFO/System.out(681): getView 0 null
04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0
AFAIK, embora eu não tenha conseguido encontrá-lo explicitamente, getView () é chamado apenas para linhas visíveis. Como meu aplicativo inicia com quatro linhas visíveis, pelo menos os números de posição que variam de 0 a 3 fazem sentido. Mas o resto está uma bagunça:
- Por que o getview é chamado para cada linha três vezes?
- De onde vêm esses convertViews quando ainda não rolou?
Pesquisei um pouco e, sem obter uma boa resposta, notei que as pessoas estavam associando esse problema a problemas de layout. Portanto, no caso, aqui está o layout que contém a lista:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/pageDetails"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false" />
</LinearLayout>
e o layout de cada linha individual:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="108dp"
android:padding="4dp">
<ImageView
android:id="@+id/thumb"
android:layout_width="120dp"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginRight="8dp"
android:src="@drawable/loading" />
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentBottom="true"
android:singleLine="true" />
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:paddingRight="4dp"
android:singleLine="true" />
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="17dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:paddingRight="4dp"
android:layout_alignWithParentIfMissing="true"
android:gravity="center" />
</RelativeLayout>
Obrigado pelo seu tempo
ListView
tem uma altura dewrap_content
, por isso não é certeza de altura, por isso, estabelece algumas crianças para fora como uma espécie de testador para ver o que vai caber no. Mude o seuListView
parafill_parent
verificar, em seguida, seus logs as chamadas devem ser drasticamente reduzidas.Tente com
match_parent
alayout_height
propriedade da exibição em lista. EvitarágetView()
ser chamado com tanta frequência.fonte
fill_parent
deve ser substituídomatch_parent
pelo nível 8 da API e superior.Eu me livrei desse problema quando mudei layout_width e layout_height para match_parent (alterar apenas layout_height não ajudou).
Nota útil atente se você tiver itens aninhados. Você precisa alterar o "mais alto" para match_parent . Espero que ajude alguém.
fonte
wrap_content
, entãoListView
não sei o quanto lista de itens estão lá para tornar o conteúdo da Lista, é por isso queListView
tenta criar tantas linhas como ele pensa são adequados para exibição, e quando você usafill_parent
oumatch_parent
,ListView
pensa, tudo bem, minha altura éx
e preciso don
número de linhas para mostrar.Não consigo responder à sua pergunta "Por que", mas definitivamente tenho uma solução para o problema dos itens irritantes do ListView repetidos " (se você tiver itens na coleção que sejam mais do que a altura da tela).
Como muitas pessoas acima mencionado, manter o android: layout_height propriedade do ListVew tag como fill_parent .
E sobre a função getView (), a solução é usar uma classe estática chamada ViewHolder . Confira este exemplo. Ele executa com êxito a tarefa de adicionar todos os itens em ur Array ou ArrayCollection.
Espero que isso ajude os amigos !!
Atenciosamente, Siddhant
fonte
GridView
e mudarandroid:layout_height
eandroid:layout_width
não funciona para mim. Mas o uso deViewHolder
imagens de repetição fixo para mim, fui através deste tutorial android-vogue.blogspot.com/2011/06/...Perguntas: Por que o adaptador chama getView () várias vezes? Resp: À medida que o Listview é processado na rolagem, ele é atualizado com as próximas visualizações futuras, para as quais o adaptador precisa obter visualizações chamando getView ().
Perguntas: Por que as chamadas são menores se a largura e a altura do listview estiverem definidas como fill_parent? Resp: Como o inflator tem o tamanho fixo para a área da tela para lista, ele calcula uma vez para renderizar as visualizações na tela.
Espero que isso resolva sua consulta.
fonte
Eu estava tendo o mesmo problema com a lista suspensa em um AutoCompleteTextView. Eu estava lutando com o problema por dois dias até chegar aqui e você me mostrar a solução.
Se eu escrever dropDownHeight = "match_parent", o problema será corrigido. Agora, o problema está relacionado à interface do usuário (quando você tem um item, o menu suspenso é muito grande), mas o problema de várias chamadas (muito mais importante) é corrigido.
Obrigado!!
fonte
"Por que o getview é chamado para cada linha três vezes?" Como o getView é chamado quando você rola na lista e, para dizer melhor, é chamado quando a posição de uma exibição da sua lista é alterada!
fonte
Estou tendo o mesmo problema. Se eu tiver a altura definida como fill_parent, recebo "geralmente" duas chamadas por linha. Mas, se eu definir a altura do meu ListView como valor exato, digamos 300dp, receberei exatamente uma chamada GetView por linha.
Portanto, parece-me que a única maneira é determinar primeiro a altura da tela e, em seguida, definir programaticamente a altura da lista com esse valor. Eu não gosto disso Espero que exista uma maneira melhor.
fonte
Para todos vocês que ainda (Depois de definir o
height
daListView
amatch_parent
) está preso (como eu era):Você também deve definir o
height
layout pai comomatch_parent
.Veja o exemplo abaixo. O
LinearLayout
é o pai aqui:fonte
Talvez isso seja tarde, mas se você estiver usando,
layout_weight
lembre-se de sempre definirlayout_width="0dp"
fonte
Eu fiz esta solução, talvez não seja a melhor, mas faz o trabalho ...
então =
espero que ajude!
fonte