2016-05-03 2 views
0

У меня есть ситуация, когда отображаются просмотры с повторным просмотром, но, полагаю, из-за некоторой оптимизации на Android они не ретранслируют.Силовой ретранслятор LinearLayout

В ряде постов предлагается вызвать view.layout() на переработанном представлении, которое, как я подозреваю, будет работать. Тем не менее, это также означает настройку моих собственных LayoutParams, и, хотя я уверен, что смогу заставить его работать, у меня действительно нет всей информации, доступной в тот момент, когда переработанное представление повторно инициализируется, чтобы сделать это правильно.

Эта проблема может быть уникальной для вложенных LinearLayouts. Когда я проверил тест, обрушившись на один LinearLayout, проблема исчезла.

Вот упрощенная версия макета, которая терпит неудачу. В этом примере вызывается внешняя LinearLayout's onLayout(). Я не знаю (без дополнительных экспериментов), если вызывается внутренняя компоновка onLayout(). TextLink OnLayout не вызывается и не используется для «других вещей».

UPDATE: внутренняя компоновка onLayout() не вызывается.

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/node" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/note" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" /> 

    ... more stuff ... 
    </LinearLayout> 

    ... more stuff ... 

</LinearLayout > 

О, я должен упомянуть, это, кажется, происходит только на устройствах под управлением Android API 19.

Я надеюсь, что есть «правильный» способ заставить Android, чтобы relayout в в TextView и другие виджеты на его уровне.

ответ

0

Я обнаружил функцию-член forceLayout(), которую я использовал в следующей рекурсивной функции. Похоже, что это не добавило значительных затрат времени на выполнение для моего приложения.

public static void forceLayoutAndroid19 (ViewGroup vg) 
    { 
    if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.KITKAT) 
    { 
     for (int i = 0, limit = vg.getChildCount(); i < limit; i++) 
     { 
     View child = vg.getChildAt (i); 
     child.forceLayout(); 
     if (child instanceof ViewGroup) 
      forceLayoutAndroid19 ((ViewGroup)child); 
     } 
    } 
    } 
Смежные вопросы