2010-08-12 15 views
32

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

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

  1. Si fijo foco al EditText en la primera fila y luego desplazarse por la ListView, al azar EditTexts de otras filas tendrá foco. Parece ser que el siguiente 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 fijo foco a un EditText, reciben un teclado virtual, escriba algo, y haga clic en el botón "Done" en mi teclado virtual, el EditText vaciará tan pronto como desaparece el teclado virtual.

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

  4. Cuando hago clic en un EditText, el teclado virtual se manifiesta, pero el EditText pierde el foco y tengo que haga clic en el EditText nuevo.

  5. Aunque configuré RatingBar en , si muevo la rueda de desplazamiento, todavía capta el foco.

Uno de mis problemas es todos los elementos de la lista visibles consiguen vuelve a dibujar cuando escribe un carácter en el teclado virtual (y puesto que el texto de la EditText se establece en algunos datos, que está vacío, que se limpia. No entiendo por qué Android decidiría volver a dibujar la lista cada vez que escribo un carácter.

Aquí está el XML que estoy usando para dibujarlas. Son burbujas blancas, con una frontera gris, y algo de texto, a RatingBar y EditText adentro:

<?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> 
+7

Acabo de votar porque me encanta su pregunta. ¿Qué tan poderoso es tu dispositivo virtual? – Nix

+0

Estoy de acuerdo con Nix. – Mike

+0

Gracias. Lo único que hice al crear el dispositivo virtual (simplemente escribí "VD" aquí y pensé que lo deletrearía en su lugar) fue escribir un nombre y seleccionar el objetivo (2.1). Todo lo demás es predeterminado. – Andrew

Respuesta

19

Parece que ListViews no puede 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.

¿Suena razonable?

+0

Esta publicación fue genial. Perdí mucho tiempo intentando obtener te xt y entradas desplegables que trabajan dentro de un ListView. Después de leer esto, reimplementé usando LinearLayout dentro de ScrollView, y funcionó perfectamente la primera vez. –

+0

Esto sucede cuando los EditText no están en ListView también (mis EditText están anidados en algunos LinearLayout y RelativeLayout). – samosaris

+0

@SamusArin ¿hay alguna solución conocida para este problema cuando tiene EditTexts anidados en varios LinearLayouts? – stephen

4

Estaba teniendo el mismo problema. Mi EditarTexto interior de LisView estaba perdiendo el foco cuando aparece el teclado, etc. getView del elemento ListView puse

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

Y este trabajo para mí.

+0

parece una especie de truco, pero funciona para mí – VsMaX

+1

EDITAR: No funciona. Parecía funcionar bien con el teclado de Samsung, pero el problema persiste en el teclado SwiftKey. – VsMaX

5

bien, añadir esto a su actividad en el manifiesto ...

android:windowSoftInputMode="adjustPan" 

Ejemplo ...

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

Agregar android: windowSoftInputMode = "adjustPan" a mi actividad en el manifiesto resolvió este problema.Otro consejo que se agradecería es una forma de agregar relleno para que el campo de texto de edición no quede aplastado contra el panel del teclado suave. – Rob

+0

Esto también me ayudó. – Giorgi

+0

esto funciona para mí, pero podría ser una buena idea explicarnos qué es eso;) – Ging3r

0

que tengo algún problema resuelto i acaba de comentar esta línea

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

Estos dos pasos han resuelto un problema similar que tenía (EditarTexto en una fila dentro ListView + comportamiento divertido teclado).

  1. Añadir androide: windowSoftInputMode = "adjustPan" atributo en archivo AndroidManifest.xml en la actividad donde el ListView es presentado.
  2. Agregar android: descenddantFocusability = "afterDescendants" atributo en el ListView sí mismo.

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" /> 

he comprobado en la galaxia S3 y funciona bien con Samsung así como teclados SwiftKey.

+0

no funciona cuando listview contiene muchas filas – Lola