Buggy listview me deixa triste
-
28-09-2019 - |
Pergunta
eu tenho um ListView
onde defini o layout de cada item em um arquivo XML separado. Neste arquivo, eu incluí um RatingBar
e um EditText
.
Eu criei programaticamente 7-8 itens neste ListView
. Quando eu rolar através deles, parece ser bastante buggy. aqui estão alguns exemplos:
Se eu definir foco para o
EditText
na primeira linha e depois role para baixo noListView
, aleatóriaEditTexts
De outras linhas terão foco. Parece ser o próximoEditText
Depois que o foco desaparece recebe foco. Talvez isso seja intencional, mas, como usuário, parece muito estranho.Se eu definir foco para um
EditText
, receba um teclado virtual, digite algo e clique no botão "feito" no meu teclado virtual, oEditText
vai esvaziar assim que o teclado virtual desaparecer.Às vezes, quando clico em um
EditText
, Receba um teclado virtual e comece a digitar cartas, as letras desaparecerão assim que eu as digito.Quando eu clico em um
EditText
, o teclado virtual se mostra, mas oEditText
perde o foco e eu tenho que clicar noEditText
novamente.Mesmo que eu tenha definido o
RatingBar
parafocusable="false"
, se eu mover minha roda de rolagem, ele ainda agarra o foco.
Um dos meus problemas é que todos os itens da lista visível são redesenhados quando eu digito um caractere no teclado virtual (e como o texto do EditText
está definido como alguns dados, que estão vazios, são limpos. Não entendo por que o Android decidiu redesenhar a lista toda vez que digito um personagem.
Aqui está o XML que estou usando para desenhá -los. São bolhas brancas, com um pensionista cinza, e algum texto, um RatingBar
e um EditText
lado de dentro:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:paddingLeft="15dip"
android:paddingRight="15dip"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="2dip"
android:background="@drawable/shape_outer">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="2dip"
android:background="@drawable/shape_inner">
<TextView
android:id="@+id/rating_category"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/dark_gray"
android:textStyle="bold"
android:layout_marginBottom="10dip" />
<RatingBar
android:id="@+id/rating_rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
android:rating="0"
android:stepSize="1"
android:focusable="false"
android:clickable="false"
/>
<EditText
android:id="@+id/rating_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_column="1"
android:padding="6dip"
android:textColor="#000000"
android:gravity="left|top"
android:lines="3"
android:hint="Comment"
android:imeOptions="actionDone" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
Solução
Parece que a ListViews não consegue lidar bem com o EdittExts. Eu fiz algumas pesquisas e o consenso parece ser "não faça isso". Então, o que eu recorrei é criar um arquivo de layout simples, que é um scrollView com um linearlayout dentro. No meu método onCreate, inflar a visão que estava usando para o meu item de lista e adiciono -o ao linearlayout. Também estou adicionando a visualização a uma lista de Array para que eu possa salvar os dados em cada visualização posteriormente.
Isso soa razoável?
Outras dicas
Bem, adicione isso à sua atividade em Manifest ...
android:windowSoftInputMode="adjustPan"
Exemplo...
<activity android:name=".mapview.AddParkingLotActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan"/>
Eu estava tendo o mesmo problema. Meu EdittExt dentro de Lisview estava perdendo o foco quando o teclado aparece, então no getview do item ListView que eu coloco
final EditText editInput = (EditText)convertView.findViewById(R.id.edit_input);
editInput.requestFocusFromTouch();
E este trabalho para mim.
Essas duas etapas resolveram um problema semelhante que eu tive (EdittExt em uma linha no ListView + Comportamento engraçado do teclado).
- Adicionar Android: WindowsoftInputMode = "Ajustpan" atributo no arquivo Androidmanifest.xml na atividade em que o ListView é apresentado.
- Adicionar Android: descendentefocusability = "AfterDescendants" atributo no próprio ListView.
Este é o exemplo real:
Androidmanifest.xml
<activity
android:name=".SubscriptionListActivity"
android:windowSoftInputMode="adjustPan"
android:label="@string/title_activity_subscriptions" >
</activity>
arquivo layout.xml
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="afterDescendants"
android:id="@+id/subscriptionList" />
Eu o testei no Samsung Galaxy S3 e funciona bem com os teclados da Samsung e SwiftKey.
Eu tenho algum problema que resolvi apenas comentando esta linha
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);