2010-08-12 4 views
32

J'ai un ListView où j'ai défini la disposition de chaque élément dans un fichier XML séparé. Dans ce fichier, j'ai inclus un RatingBar et un EditText. J'ai créé par programmation 7-8 éléments dans ce ListView. Quand je les feuillette, cela semble être assez bogué. Voici quelques exemples:Buggy ListView me rend triste

  1. Si je mets l'accent sur le EditText dans la première rangée, puis faites défiler la ListView, EditTexts au hasard d'autres lignes auront mise au point. Il semble que le prochain EditText après que le concentré disparaisse reçoive le focus. C'est peut-être intentionnel, mais en tant qu'utilisateur, cela semble très bizarre.

  2. Si je mets le focus à un EditText, recevoir un clavier virtuel, tapez quelque chose, et cliquez sur le bouton « OK » sur mon clavier virtuel, le EditText videra dès que le clavier virtuel disparaît.

  3. Parfois, lorsque je clique sur un EditText, recevoir un clavier virtuel et commencer à taper des lettres, les lettres disparaissent dès que je les tape.

  4. Lorsque je clique sur un EditText, le clavier virtuel se montre, mais le EditText perd le focus et je dois cliquer sur le EditText à nouveau.

  5. Même si j'ai réglé le RatingBar sur focusable="false", si je bouge ma molette de défilement, la saisie reste active.

Un de mes problèmes est tous les éléments de liste visibles se redessine quand je tape un caractère dans le clavier virtuel (et depuis le texte du EditText est réglé sur certaines données, ce qui est vide, il est effacé. Je ne comprends pas pourquoi Android déciderait de redessiner la liste chaque fois que je tape un caractère

Voici le XML que j'utilise pour les dessiner: ce sont des bulles blanches, avec une bordure grise, et du texte, un RatingBar et un EditText à l'intérieur:

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

Je viens de voter parce que j'aime le nom de votre question. Quelle est la puissance de votre appareil virtuel? – Nix

+0

Je suis d'accord avec Nix. – Mike

+0

Lol merci. La seule chose que j'ai faite lors de la création du périphérique virtuel (j'ai juste tapé "VD" ici et j'ai pensé que je l'épelais à la place) était de taper un nom et de sélectionner la cible (2.1). Tout le reste est par défaut. – Andrew

Répondre

19

Il semble que ListViews ne gère pas bien les EditTexts. J'ai fait des recherches et le consensus semble être "ne fais pas ça". Donc, ce que j'ai recouru à la création d'un fichier de mise en page simple qui est un ScrollView avec un LinearLayout à l'intérieur. Dans ma méthode onCreate, je gonfle la vue que j'utilisais pour mon élément de liste et l'ajoute à LinearLayout. J'ajoute également la Vue à une ArrayList afin que je puisse enregistrer les données dans chaque Vue plus tard.

Cela vous semble-t-il raisonnable?

+0

Cet article était génial.J'ai perdu beaucoup de temps à essayer d'obtenir te entrées xt et dropdown travaillant dans un ListView. Après avoir lu ceci, j'ai réimplémenté en utilisant un LinearLayout dans un ScrollView, et cela a fonctionné parfaitement la première fois. –

+0

Cela arrive quand les EditText ne sont pas aussi dans ListView (mes EditText sont imbriqués dans quelques LinearLayout et RelativeLayout). – samosaris

+0

@SamusArin existe-t-il une solution connue à ce problème lorsque EditTexts est imbriqué dans plusieurs LinearLayouts? – stephen

4

J'avais le même problème. Mon EditText intérieur de LisView était en train de perdre le focus lorsque le clavier apparaît, ainsi de suite getView de l'élément ListView je mets

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

Et ce travail pour moi.

+0

ressemble à une sorte de tour, mais travaille pour moi – VsMaX

+1

EDIT: Cela ne fonctionne pas. Il semblait fonctionner correctement avec le clavier samsung, mais le problème persiste sur le clavier SwiftKey. – VsMaX

5

Eh bien, ajoutez ceci à votre activité dans le manifeste ...

android:windowSoftInputMode="adjustPan" 

exemple ...

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

Ajouter android: windowSoftInputMode = "adjustPan" à mon activité dans le manifeste résolu ce problème.Une autre astuce qui serait appréciée est une façon d'ajouter un remplissage pour que le champ edittext ne soit pas écrasé contre le panneau de clavier virtuel. – Rob

+0

Cela m'a aidé aussi. – Giorgi

+0

cela fonctionne pour moi, mais pourrait être une bonne idée nous expliquer ce que c'est; – Ging3r

0

i ont une question que je résolus simplement commenter cette ligne

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

Ces deux étapes a résolu un problème similaire que j'avais (EditText sur une ligne dans le comportement du clavier ListView + drôle).

  1. Ajouter android: windowSoftInputMode = "adjustPan" attribut dans fichier AndroidManifest.xml sur l'activité où le ListView est présenté.
  2. Ajouter android: descendantFocusability = "afterDescendants" attribut dans ListView lui-même.

Ceci est l'exemple réel:

AndroidManifest.xml

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

fichier layout.xml

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

Je l'ai testé sur Samsung Galaxy S3 et il fonctionne très bien avec Samsung ainsi que les claviers SwiftKey.

+0

son ne fonctionne pas lorsque ListView contient plusieurs lignes – Lola