Багги ListView делает меня грустным - PullRequest
34 голосов
/ 12 августа 2010

У меня есть ListView, где я определил макет каждого элемента в отдельном файле XML.В этот файл я включил RatingBar и EditText.

. Я программно создал 7-8 элементов в этом ListView.Когда я прокручиваю их, кажется, что они довольно глючные.Вот несколько примеров:

  1. Если я установлю фокус на EditText в первой строке, а затем прокрутите вниз ListView, фокус будет у случайных EditTexts из других строк.Кажется, что следующий EditText после того, как сфокусированный исчезает, получает фокус.Возможно, это сделано намеренно, но как пользователю это кажется очень странным.

  2. Если я установлю фокус на EditText, получу виртуальную клавиатуру, что-то наберу и нажмите "Кнопка «Готово» на моей виртуальной клавиатуре, EditText исчезнет, ​​как только виртуальная клавиатура исчезнет.

  3. Иногда, когда я нажимаю EditText, получаю виртуальную клавиатуру и запускаюнабирая буквы, буквы исчезнут, как только я наберу их.

  4. Когда я нажимаю на EditText, виртуальная клавиатура показывает себя, но EditText теряет фокус, и япридется снова нажать EditText.

  5. Несмотря на то, что я установил RatingBar на focusable="false", если я перемещаю колесо прокрутки, оно все равно захватывает фокус.

Одной из моих проблем является то, что все видимые элементы списка перерисовываются, когда я набираю символ на виртуальной клавиатуре (и поскольку текст EditText настроен на некоторые данные, которые пусты,это очищается. Я не понимаю, почему Android решил бы перерисовывать список каждыйвремя ввода символа.

Вот XML, который я использую для их рисования.Это белые пузыри с серой границей и текстом: RatingBar и EditText внутри:

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

Ответы [ 5 ]

19 голосов
/ 12 августа 2010

Похоже, ListViews не в состоянии хорошо обрабатывать EditTexts.Я провел некоторое исследование, и консенсус, похоже, «не делай этого».Итак, я прибег к созданию простого файла макета, который представляет собой ScrollView с LinearLayout внутри.В моем методе onCreate я надуваю представление, которое я использовал для своего элемента списка, и добавляю его в LinearLayout.Я также добавляю View в ArrayList, чтобы потом сохранить данные в каждом View.

Это звучит разумно?

5 голосов
/ 29 июня 2012

Ну, добавьте это к своей деятельности в манифесте ...

android:windowSoftInputMode="adjustPan"

Пример ...

<activity android:name=".mapview.AddParkingLotActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan"/>
4 голосов
/ 08 декабря 2011

У меня была такая же проблема.Мой EditText внутри LisView терял фокус при появлении клавиатуры, поэтому на getView из элемента ListView я положил

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

И это работает для меня.

3 голосов
/ 17 февраля 2015

Эти два шага решили похожую проблему (EditText в строке в ListView + забавное поведение клавиатуры).

  1. Добавить android: windowSoftInputMode = "AdjustPan" атрибут вФайл AndroidManifest.xml в действии, в котором представлен ListView.
  2. Добавить android: DesndantFocusability = "afterDescendants" в самом ListView.

Фактический пример:

AndroidManifest.xml

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

файл layout.xml

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

Я протестировал его на Samsung Galaxy S3, и он также отлично работает с Samsungв качестве клавиш SwiftKey.

0 голосов
/ 04 августа 2014

У меня есть проблема, которую я решил, просто комментируя эту строку

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