2015-09-04 6 views
5

Итак, у меня есть горизонтальный RecyclerView внутри вертикального ScrollView. Все внутри моего макета отображается отлично, и все прокручивается в направлениях, которые я хочу, и это делается гладко.Горизонтальный RecyclerView внутри вертикальный ScrollView

Единственная проблема, с которой я столкнулся, заключается в том, что RecyclerView находится под каким-либо другим контентом в ScrollView, и когда RecyclerView частично виден, он будет выровнять нижнюю часть RecyclerView с нижней частью экрана при запуске. Это означает, что содержимое выше RecyclerView сдвигается с экрана.

Кто-нибудь знает, почему это происходит, и как я могу это исправить?

Вот простой макет, который делает то, что я только что описал. Вам даже не нужно заполнять RecyclerView, он все равно это сделает.

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

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

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="500dp" 
      android:background="#fff"/> 

     <android.support.v7.widget.RecyclerView 
      android:layout_width="match_parent" 
      android:layout_height="200dp" 
      android:background="#000"/> 

    </LinearLayout> 

</ScrollView> 
+0

Проверить это https://github.com/lucasr/twoway-view/. – Raghunandan

+0

Из того, что я знаю о TwoWayView, это не имеет отношения к моему вопросу, но в любом случае спасибо. –

ответ

6

Оказывается, этот вопрос, как сообщается, Google здесь Issue - 81854

Согласно Google он работает как задумано. Проблема заключается в том, что RecyclerView имеет значение focusableInTouchMode, равное true. Чтобы устранить проблему, я установил focusableInTouchMode и focusable в true в самом верхнем виде ScrollView.

Ниже приводится исправление для образца кода я представил в оригинальный вопрос:

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

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

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="500dp" 
      android:background="#fff" 
      android:focusableInTouchMode="true" 
      android:focusable="true"/> 

     <android.support.v7.widget.RecyclerView 
      android:layout_width="match_parent" 
      android:layout_height="200dp" 
      android:background="#000"/> 

    </LinearLayout> 

</ScrollView> 
+0

Вы сказали установить «focusableInTouchMode» и «focusable» в true в самом верхнем вид ScrollView. Но в коде я вижу что-то другое. Просьба уточнить. –

+0

@ Parsi Извините. Поскольку ScrollView может иметь только один ребенок, я имел в виду самый верхний вид дочернего элемента ScrollView. –

+0

Тогда я не понимаю. Спасибо. Никакого упоминания :) –