4

У меня есть экран чата, который содержит два вида: просмотр ресайклера для отображения предыдущего чата и пользовательский вид, который инкапсулирует текст редактирования, кнопку отправки и другое представление ресайзера, чтобы позволить пользователю выбирать другие вещи для отправки, как фотографии, и т. Д. Это настраиваемое представление называется «панель».RecyclerView не уважает height = wrap_content?

Итак, мой чат деятельность имеет следующую структуру:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <chat.example.app.widget.Panel 
     style="@style/PanelStyle" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|center" 
     android:id="@+id/panel" /> 

    <android.support.v7.widget.RecyclerView 
     android:background="@android:color/holo_red_dark" 
     android:layout_margin="@dimen/activity_horizontal_margin" 
     android:scrollbars="vertical" 
     android:id="@+id/previous_chat" 
     android:layout_above="@id/panel" 
     android:layout_alignParentTop="true" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</RelativeLayout> 

и моя «Группа» точка зрения имеет следующую структуру:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white"> 
    <RelativeLayout 
     android:id="@+id/staging_area_root" 
     android:layout_gravity="center" 
     android:gravity="center" 
     android:paddingLeft="5dp" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <!-- Chat box and send --> 
    </RelativeLayout> 
    <!-- THIS GUY IS PROBLEMATIC --> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/card_set" 
     android:layout_margin="15dp" 
     android:layout_below="@id/staging_area_root" 
     android:background="@android:color/holo_blue_bright" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</RelativeLayout> 

Проблема в том, что вид утилизатора от Panel заглатывает весь экран. Поэтому все, что я вижу, - это проблематичный просмотр ресайклеров из класса Panel.

Оба этих вида ресайклеров имеют назначенные им LinearLayoutManager. Адаптеры.

Я имею последнюю библиотеку поддержки в моем build.gradle:

compile 'com.android.support:recyclerview-v7:23.2.0' 

и перебирая новейшие андроид разработчиков в блоге сообщение:

Этот релиз приносит захватывающую новую функцию в API LayoutManager: автоматическое измерение! Это позволяет RecyclerView самому размеру на основе размера его содержимого. Это означает, что ранее недоступные сценарии , такие как использование WRAP_CONTENT для измерения RecyclerView, теперь возможны. Вы найдете все встроенные в LayoutManagers теперь поддерживают автоматическое измерение.

Я что-то пропустил?

Обновление 1:

Я добавил адаптер г-ну проблематичной зрения ресайклера с 0 элементов в нем. Все еще нет решения.

Update2:
Скриншот:

enter image description here

+0

Вместо использования 'android: layout_gravity' на вашей' панели' используйте 'android: layout_alignParentBottom' и' android: layout_centerHorizontal'. Я скопировал - вставил ваши макеты, удалив XML-панель 'Panel' и заменив ее на свой макет xml, и все выглядит хорошо на предварительном просмотре в Android Studio. –

+0

@AlexTownsend не повезло. В качестве обновления я ** ** ** использую 'alignParentBottom'. Не обновил код здесь. Возможно, это имеет какое-то отношение к тому, как создается мое пользовательское представление? –

+0

Вы можете разместить снимок экрана Preview в Android Studio или скриншот экрана с устройства/эмулятора? –

ответ

7

фрагмент кода взят из 23,2 RecyclerViewonMeasure() вызова:

if (mLayout.mAutoMeasure) { 
     final int widthMode = MeasureSpec.getMode(widthSpec); 
     final int heightMode = MeasureSpec.getMode(heightSpec); 
     final boolean skipMeasure = widthMode == MeasureSpec.EXACTLY 
       && heightMode == MeasureSpec.EXACTLY; 
     mLayout.onMeasure(mRecycler, mState, widthSpec, heightSpec); 
     if (skipMeasure || mAdapter == null) { 
      return; 
     } 
     if (mState.mLayoutStep == State.STEP_START) { 
      dispatchLayoutStep1(); 
     } 
     // set dimensions in 2nd step. Pre-layout should happen with old dimensions for 
     // consistency 
     mLayout.setMeasureSpecs(widthSpec, heightSpec); 
     mState.mIsMeasuring = true; 
     dispatchLayoutStep2(); 

     // now we can get the width and height from the children. 
     mLayout.setMeasuredDimensionFromChildren(widthSpec, heightSpec); 

     // if RecyclerView has non-exact width and height and if there is at least one child 
     // which also has non-exact width & height, we have to re-measure. 
     if (mLayout.shouldMeasureTwice()) { 
      mLayout.setMeasureSpecs(
        MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY), 
        MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY)); 
      mState.mIsMeasuring = true; 
      dispatchLayoutStep2(); 
      // now we can get the width and height from the children. 
      mLayout.setMeasuredDimensionFromChildren(widthSpec, heightSpec); 
     } 
    } 

mLayout.setMeasuredDimensionFromChildren() вызов будет делать автоматического измерения на основе офф размер детей RecyclerView. Для запуска автоматического измерения необходимо использовать RecyclerView.Adapter с 1 или более детьми.

+0

Невозможно спамить кнопку +1. Благодаря тонну. :) –

Смежные вопросы