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:

  1. Se eu definir foco para o EditText na primeira linha e depois role para baixo no ListView, aleatória EditTexts De outras linhas terão foco. Parece ser o próximo EditText Depois que o foco desaparece recebe foco. Talvez isso seja intencional, mas, como usuário, parece muito estranho.

  2. Se eu definir foco para um EditText, receba um teclado virtual, digite algo e clique no botão "feito" no meu teclado virtual, o EditText vai esvaziar assim que o teclado virtual desaparecer.

  3. À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.

  4. Quando eu clico em um EditText, o teclado virtual se mostra, mas o EditText perde o foco e eu tenho que clicar no EditText novamente.

  5. Mesmo que eu tenha definido o RatingBar para focusable="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>
Foi útil?

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).

  1. Adicionar Android: WindowsoftInputMode = "Ajustpan" atributo no arquivo Androidmanifest.xml na atividade em que o ListView é apresentado.
  2. 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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top