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:
Si fijo el foco en
EditText
en la primera fila y luego meEditTexts
hacia abajo enListView
, al azarEditTexts
de otras filas tendrá el foco. Parece ser que el próximoEditText
después de que el enfocado desaparece recibe el foco. Quizás esto es intencional, pero, como usuario, parece muy extraño.Si configuro el foco en
EditText
, recibo un teclado virtual,EditText
algo yEditText
clic en el botón "Listo" en mi teclado virtual,EditText
seEditText
en cuanto desaparece el teclado virtual.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.Cuando hago clic en
EditText
, se muestra el teclado virtual, peroEditText
pierde el foco y tengo que hacer clic enEditText
nuevamente.Aunque configuré la
RatingBar
deRatingBar
comoRatingBar
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).
- Agregue el atributo android: windowSoftInputMode = "adjustPan" en el archivo AndroidManifest.xml en la actividad donde se presenta ListView.
- 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);