Как центрировать RecyclerView по центру (и без прокрутки), когда это возможно?

Это короткий вопрос:

Предположим, у меня есть RecyclerView с неопределенным количеством элементов, что мне с ним делать, чтобы, если есть небольшое количество элементов, которые (все) могли поместиться на экране, они были центрированы, и пользователь не сможет проматывать ?

Конечно, если слишком много элементов, которые не помещаются на экране, я хотел бы, чтобы RecyclerView отображал их все как обычно (от начала до того, сколько он может отображать, и разрешить прокрутку).

Чтобы понять, что я имею в виду, я думаю, что такое возможно при использовании ScrollView (или HorizontalScrollView, если оно горизонтальное) вместе с LinearLayout, который устанавливает центр тяжести.


person android developer    schedule 16.12.2015    source источник


Ответы (2)


Хорошо, я думаю, что нашел способ:

сначала мы ждем, пока RecyclerView завершит процесс компоновки, как я нашел здесь .

Затем вам нужно проверить, какие дочерние представления отображаются (доступны в используемом вами LayoutManager), и посмотреть на первое и последнее.

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

person android developer    schedule 16.12.2015

Я нашел один сложный способ добиться этого.

Основная концепция: динамически устанавливать высоту RV в коде.

    RecyclerView rv= (RecyclerView) findViewById(R.id.rv);
    rv.setAdapter(new MySlideUpAdapter());
    rv.setLayoutManager(new LinearLayoutManager(this));
    ViewGroup.LayoutParams layoutParams = rv.getLayoutParams();
    layoutParams.height=100;
    rv.setLayoutParams(layoutParams);

Вам может понадобиться рассчитать высоту дома на колесах по childcount*childheight, чтобы получить значение цены. И не забудьте сравнить высоту с высотой родительского макета, убедитесь, что высота RV меньше, чем его высота родительского макета.

Вот мой макет

   <RelativeLayout...>
     <android.support.v7.widget.RecyclerView
       android:id="@+id/rv"
       android:layout_centerInParent="true"
       android:layout_width="match_parent"
       <-height will be changed in code, ignore the 50dp-> 
       android:layout_height="50dp">
     </android.support.v7.widget.RecyclerView>
   </RelativeLayout>

введите здесь описание изображения

person 空気嫁    schedule 16.12.2015
comment
Что делать, если размеры представлений отличаются друг от друга? Или иметь высоту wrap_content, которая может меняться в зависимости от содержимого данных? - person android developer; 16.12.2015
comment
@androiddeveloper да .. Мой путь слишком сложен. Для разных представлений элементов код может быть таким: 1. view.measuer(0,0) 2. view.getmesuredheight. Мне нравится твой путь! - person 空気嫁; 17.12.2015
comment
Спасибо. На самом деле вы приложили больше усилий, поэтому я даю вам +1. :) - person android developer; 17.12.2015