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);