Buggy ListView меня огорчает

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

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

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

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

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

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

  • Даже если я установил 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>

Ответ 1

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

Звучит ли это разумно?

Ответ 2

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

android:windowSoftInputMode="adjustPan"

Пример...

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

Ответ 3

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

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

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

Ответ 4

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

  • Добавить атрибут android: windowSoftInputMode = "adjustPan" в Файл AndroidManifest.xml в действии, где ListView представлены.
  • Добавить android: descendantFocusability = "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.

Ответ 5

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

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