android listview listviewitem virtual-keyboard

android - Buggy ListView me pone triste



listviewitem virtual-keyboard (5)

Bueno, agregue esto a su actividad en manifiesto ...

android:windowSoftInputMode="adjustPan"

Ejemplo...

<activity android:name=".mapview.AddParkingLotActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan"/>

Tengo un ListView donde he definido el diseño de cada elemento en un archivo XML separado. En este archivo he incluido una RatingBar y un EditText .

He creado programáticamente 7-8 elementos en este ListView . Cuando me desplazo a través de ellos, parece ser bastante defectuoso. Aquí hay unos ejemplos:

  1. Si fijo el foco en EditText en la primera fila y luego me EditTexts hacia abajo en ListView , al azar EditTexts de otras filas tendrá el foco. Parece ser que el próximo EditText después de que el enfocado desaparece recibe el foco. Quizás esto es intencional, pero, como usuario, parece muy extraño.

  2. Si configuro el foco en EditText , recibo un teclado virtual, EditText algo y EditText clic en el botón "Listo" en mi teclado virtual, EditText se EditText en cuanto desaparece el teclado virtual.

  3. A veces, cuando hago clic en EditText , recibo un teclado virtual y empiezo a escribir letras, las letras desaparecerán tan pronto como las escriba.

  4. Cuando hago clic en EditText , se muestra el teclado virtual, pero EditText pierde el foco y tengo que hacer clic en EditText nuevamente.

  5. Aunque configuré la RatingBar de RatingBar como RatingBar focusable="false" , si muevo la rueda de desplazamiento, todavía capta el foco.

Uno de mis problemas es que todos los elementos de la lista visible se vuelven a dibujar cuando EditText un carácter en el teclado virtual (y dado que el texto de EditText está configurado en algunos datos, que está vacío, se borra. No entiendo por qué Android Decidiría volver a dibujar la lista cada vez que escriba un personaje.

Aquí está el XML que estoy usando para dibujarlos. Son burbujas blancas, con una frontera gris, y algo de texto, una RatingBar y un EditText 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>


Estaba teniendo el mismo problema. Mi EditText dentro de LisView estaba perdiendo el foco cuando aparece el teclado, así que en getView del elemento ListView puse

final EditText editInput = (EditText)convertView.findViewById(R.id.edit_input); editInput.requestFocusFromTouch();

Y este trabajo para mí.


Estos dos pasos resolvieron un problema similar que tuve (EditText en una fila dentro de ListView + comportamiento de teclado divertido).

  1. Agregue el atributo android: windowSoftInputMode = "adjustPan" en el archivo AndroidManifest.xml en la actividad donde se presenta ListView.
  2. Añada el atributo android: descenddantFocusability = "afterDescendants" en el ListView.

Este es el ejemplo real:

AndroidManifest.xml

<activity android:name=".SubscriptionListActivity" android:windowSoftInputMode="adjustPan" android:label="@string/title_activity_subscriptions" > </activity>

archivo layout.xml

<ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:descendantFocusability="afterDescendants" android:id="@+id/subscriptionList" />

Lo probé en Samsung Galaxy S3 y funciona bien con Samsung y con los teclados SwiftKey.


Parece que ListViews no son capaces de manejar bien EditTexts. Hice algunas investigaciones y el consenso parece ser "no hagas eso". Entonces, a lo que he recurrido es a crear un archivo de diseño simple que es un ScrollView con un LinearLayout dentro. En mi método onCreate, inflico la Vista que estaba usando para mi elemento de lista y lo agrego a LinearLayout. También estoy agregando la Vista a una ArrayList para poder guardar los datos en cada Vista más adelante.

¿Esto suena razonable?


Tengo un problema que he resuelto solo comentando esta línea

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);