Расширяемая карта RecyclerView

Я делаю небольшой проект с RecyclerView с элементами CardView внутри. Я создал расширяемую карту (расширяется нажатием на маленькую кнопку внутри карты). Каждая карточка всегда содержит видимую часть (id:top_layout) и расширяемую часть (id:expandable_part_layout).

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

Итак, мой вопрос: как сделать так, чтобы после того, как я расширил карту, прокрутил RecyclerView до высоты расширенной части карты? - Это моя идея, возможно, у кого-то есть лучшее решение.

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   app:cardCornerRadius="8px"
   app:cardPreventCornerOverlap="false">

<RelativeLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

    <RelativeLayout
        android:id="@+id/top_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="false"
        android:layout_alignParentTop="true"
        >
             <!-- some other controls -->

            <ImageButton
                android:id="@+id/card_header_inner_expand_btn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:background="?android:selectableItemBackground"
                android:clickable="true"
                android:padding="6dp"
                android:src="@drawable/expand_icon" />

    </RelativeLayout>

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/expandable_part_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/top_layout"
        android:animateLayoutChanges="true"
        android:clickable="false"
        android:visibility="gone">

        <RadioGroup
            android:id="@+id/extened_stage_radiogroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:orientation="vertical">

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

            <RadioButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

        </RadioGroup>

      <!-- some other controls -->

    </RelativeLayout>
</RelativeLayout>


person Zbyszko    schedule 28.07.2015    source источник
comment
Вы нашли решение этой проблемы? У меня точно такая же проблема.   -  person Kerkhofsd    schedule 14.03.2016
comment
Мне тоже интересно, если вы нашли решение для этого.   -  person Allinone51    schedule 14.03.2016
comment
К сожалению, я пока не нашел решения.   -  person Zbyszko    schedule 14.03.2016


Ответы (3)


Какую технику вы используете для этого?

Я был в такой же ситуации, но для меня проблемой были эти функции ExpandAndCollapseViewUtil.expand() и ExpandAndCollapseViewUtil.collapse() из этого руководства Diseño Android: Tarjetas con CardView, поэтому я им не пользовался. Вместо этого я просто показываю/скрываю представление карты без анимации.

person Moisés Moreno    schedule 24.02.2017

Вы можете использовать этот экземпляр lib самостоятельно, попробуйте следующее:

ШАГ 1. Добавьте следующую зависимость в файл build.gradle:

**compile 'com.github.traex.expandablelayout:library:1.2.2'** use instead of
 compile 'com.github.traex.expandablelayout:library:1.3'

ШАГ 2. Добавьте вид ниже к макету вашей карточки , card_layout Должно выглядеть так:

<com.andexert.expandablelayout.library.ExpandableLayout
    android:id="@+id/row_0"
    xmlns:expandable="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    expandable:headerLayout="@layout/YOUR_CARD_VIEW_UI"
    expandable:contentLayout="@layout/YOUR_CARD_VIEW_EXPANDED_UI"/>

ШАГ 3. При определении RecyclerView не забудьте:

recList.setItemViewCacheSize(ITEMS_COUNT);

Не стейсняйся спросить :-)

person Mahdi Astanei    schedule 20.02.2016

У меня была такая же проблема, и я решил ее, поместив следующий код (Kotlin) в ViewHolder

    if (expandableView.isVisible) {
        val recyclerView = containerView?.parent as RecyclerView
        recyclerView.adapter.notifyItemChanged(adapterPosition)
        recyclerView.smoothScrollToPosition(adapterPosition)
    }

Как вы видите, перед прокруткой до позиции я уведомил адаптер о том, что элемент в этой позиции был изменен. И я делаю это только в том случае, если вид стал видимым

person Tima    schedule 31.07.2018