Первая запись ListView всегда неверна для RTL - PullRequest
1 голос
/ 25 апреля 2019

По какой-то причине первая запись в моем ListView всегда переворачивается неправильно, когда я использую RTL.Например:

Elements in ListView Flipped wrong way around Дополнительная информация:

  1. ListView находится в DialogFragment.

  2. Я обновил свой манифест для поддержки RTL (остальная часть приложения работает нормально)

  3. В ListView есть адаптер, макет для элемента выглядит следующим образом:

    <ImageView
        android:id="@+id/dropdown_icon"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:src="@drawable/photo_button_disabled"
        android:layout_gravity="center_horizontal"/>
    
    <ImageView
        android:id="@+id/count_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="false"
        android:scaleType="fitCenter"
        android:layout_alignEnd="@+id/dropdown_icon"
        android:layout_alignRight="@+id/dropdown_icon"
        android:layout_alignStart="@+id/dropdown_icon"
        android:layout_alignLeft="@+id/dropdown_icon"
        android:layout_alignTop="@+id/dropdown_icon"
        android:layout_alignBottom="@+id/dropdown_icon"
        android:adjustViewBounds="true"/>
    

Хотя макет фрагмента диалога выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:background="@drawable/rounded_bg">

<TextView
    android:id="@+id/title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="@android:color/white"
    android:textStyle="bold"
    android:textSize="@dimen/dialog_title"
    android:padding="10dp"/>

<LinearLayout
    android:layout_below="@+id/title"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <!-- This table should be populated with all the different options -->
        <ListView
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:id="@+id/entry_list"
            android:divider="?android:attr/dividerHorizontal"
            android:showDividers="middle"
            android:background="@color/overlay"
            android:descendantFocusability="afterDescendants"
            android:animateLayoutChanges="true">
        </ListView>


    <!-- The save and clear buttons-->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingLeft="@dimen/general_padding"
        android:paddingTop="@dimen/general_padding"
        android:paddingRight="@dimen/general_padding">

        <TextView
            android:id="@+id/warning_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:text="@string/recon_value_required"
            android:visibility="gone"
            android:textColor="@color/warningColour"
            android:layout_marginBottom="@dimen/list_vertical_margin"/>

        <LinearLayout
            android:id="@+id/button_container"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clipChildren="false"
            android:clipToPadding="false"
            android:layout_below="@id/warning_label"
            android:paddingBottom="@dimen/general_padding">
            <Button
                android:id="@+id/clear_button"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:background="@drawable/rounded_button"
                android:text="@string/clear"
                android:textColor="@color/buttonTextColour"
                android:layout_weight="1"
                android:foreground="?attr/selectableItemBackground"
                android:layout_marginRight="8dp"
                android:layout_marginEnd="8dp"/>

            <Button
                android:id="@+id/save_button"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:background="@drawable/rounded_button"
                android:text="@string/save"
                android:textColor="@color/buttonTextColour"
                android:layout_weight="1"
                android:foreground="?attr/selectableItemBackground"
                android:layout_marginLeft="8dp"
                android:layout_marginStart="8dp"/>
        </LinearLayout>

    </RelativeLayout>

</LinearLayout>
</RelativeLayout>

Я не уверен, что еще можно попробовать.Я возился с разными макетами.Изменение ориентации не решает проблему.Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 22 мая 2019

При исследовании я обнаружил, что проблема возникает только в ListViews в диалогах (я пробовал AlertDialog), и направленность самой верхней строки ListView фиксируется после прокрутки вниз и обратно.Я не уверен, почему это происходит, и могу только предложить

  1. ручную настройку направления на основе конфигурации (которая достаточно надежно обновляется в зависимости от языка устройства), добавив rowView.setLayoutDirection(getContext().getResources().getConfiguration().getLayoutDirection()); в getViewвашего ListAdapter
  2. Не использовать повторно / перерабатывать строки / элементы ListView, хотя это может замедлить работу вашего приложения и, вероятно, нежелательно
  3. Переключение на RecyclerView

PS См. этот вопрос с той же проблемой

Кажется, что PPS getView вызывается многократно и нерегулярно только для ListViews в диалогах, а не для фрагментов / операций, и его, возможно, стоит рассмотреть.Хотя поведение ListView не гарантируется, оно все же немного странно

...