Clickable CardView внутри NestedScroll не запускает прокрутку

У меня есть макет с CoordinatorLayout, AppBarLayout и NestedScrollView, внутри NestedScrollView у меня есть несколько CardView, все работает нормально, пока я не настрою CardViews на клики, а затем, если я начну прокрутку в CardView, прокрутка не работает.

Это мой макет:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_height="256dp"
    android:layout_width="match_parent"
    app:contentScrim="?attr/colorPrimary"
    android:fitsSystemWindows="true"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary">
        <ImageView
            android:id="@+id/backdrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:fitsSystemWindows="true"
            app:layout_collapseMode="parallax"/>
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_height="?attr/actionBarSize"
            android:layout_width="match_parent"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
    android:id="@+id/nestedScroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_gravity="fill_vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:cardCornerRadius="0dp"
            app:cardUseCompatPadding="true">
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <View
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:background="@color/primary" />
                <LinearLayout
                    android:orientation="vertical"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:paddingTop="4dp"
                    android:paddingLeft="7dp"
                    android:paddingRight="7dp"
                    android:paddingBottom="7dp">
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:lines="1"
                        android:includeFontPadding="false"
                        android:text="Title1"
                        style="@android:style/TextAppearance.Medium" />
                    <TextView
                        android:lines="2"
                        android:text="Description 1"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content" />
                </LinearLayout>
            </LinearLayout>
        </android.support.v7.widget.CardView>
       ...
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>


comment
Жалко открытую награду +50, но это определенно дубликат stackoverflow.com/questions/31136740/ - удалите награду и отметьте дубликат.   -  person Davideas    schedule 13.07.2015
comment
Это не тот же случай, хотя из названия кажется, что это так, я думаю, что настоящая проблема здесь заключается в том, что когда я устанавливаю просмотры карт как интерактивные, событие касания не всплывает до просмотра прокрутки. У меня есть макет fill_vertical в прокрутке, и это устранило некоторые проблемы для меня, но не исправляет прокрутку с интерактивными элементами.   -  person Escobar5    schedule 13.07.2015
comment
Возможно, вы правы, но, вероятно, нам нужно переопределить событие перехвата касания, чтобы оно не распространялось на дочернее представление, возвращающее true.   -  person Davideas    schedule 14.07.2015
comment
В каком представлении я должен обрабатывать событие касания перехвата?   -  person Escobar5    schedule 14.07.2015
comment
Владелец ответа на другой странице, которую я дал вам, прокомментировал, что действительно он не решил проблему и что похоже, проблема связана с CollapsingToolbar, потому что, если мы удалим CollapsingToolbar, он заработает нормально. Теперь у нас есть 2 варианта: ждать, пока все эти многочисленные баги исправят Google, или пытаться что-то реализовать. Для этой последней гипотезы я думаю, что метод переопределения onInterceptTouchEvent, и вы можете начать с этого класса FixedScrollingViewBehavior, вы можете найти здесь gist .github.com/EmmanuelVinas/c598292f43713c75d18e, которые уже решают некоторые проблемы.   -  person Davideas    schedule 14.07.2015
comment
Не работает для меня. Очень обидно... Но все равно спасибо :)   -  person Martin Pfeffer    schedule 30.07.2015
comment
Вы решили эту проблему???   -  person goldsmit409    schedule 30.07.2015
comment
Сейчас, кажется, я заметил проблему...   -  person Martin Pfeffer    schedule 30.07.2015
comment
Взгляните на эту демонстрацию Криса Бейнса github.com/chrisbanes/cheesesquare. В ней есть CardViews внутри NestedScrollView. , и если вы сделаете их интерактивными, все будет работать нормально.   -  person Pavlo Zin    schedule 01.08.2015
comment
@PaulZin Да, эта демонстрация работает с событием клика, но кажется, что она работает из-за высоты содержимого, если я уберу часть строки cheese_ipsum, чтобы она стала короче, у нее тоже будет такая же проблема.   -  person Escobar5    schedule 06.08.2015
comment
Эта проблема была исправлена ​​в 23.1.0 версии библиотеки поддержки.   -  person Abhishek V    schedule 16.10.2015


Ответы (3)


Проблема возникает, когда ScrollView не заполнен содержимым. Я думаю, что это очень странная ошибка в Android.

Решение'..

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

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_height="256dp"
        android:layout_width="match_parent"
        app:contentScrim="?attr/colorPrimary"
        android:fitsSystemWindows="true"
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary">

            <ImageView
                android:id="@+id/backdrop"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="centerCrop"
                android:fitsSystemWindows="true"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_height="?attr/actionBarSize"
                android:layout_width="match_parent"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/nestedScroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_gravity="fill_vertical">

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

            <android.support.v7.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:cardCornerRadius="0dp"
                app:cardUseCompatPadding="true"
                android:foreground="?android:attr/selectableItemBackground"
                android:clickable="true">

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

                    <View
                        android:layout_width="80dp"
                        android:layout_height="80dp"
                        android:background="#cdcdcd"
                        android:clickable="true"/>

                    <LinearLayout
                        android:orientation="vertical"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:paddingTop="4dp"
                        android:paddingLeft="7dp"
                        android:paddingRight="7dp"
                        android:paddingBottom="7dp">

                        <TextView
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:lines="1"
                            android:includeFontPadding="false"
                            android:text="Title1"
                            style="@android:style/TextAppearance.Medium"/>

                        <TextView
                            android:lines="2"
                            android:text="Description 1"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            />
                    </LinearLayout>
                </LinearLayout>
            </android.support.v7.widget.CardView>

            <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="1000dp"
            android:orientation="vertical"
            android:layout_margin="4dp"
            android:background="#c1c1c1">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="20pt"
                android:text="some content..."/>
        </LinearLayout>

        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
person Martin Pfeffer    schedule 30.07.2015
comment
Это исправляет прокрутку, но верхние элементы прокручиваются за пределы окна. - person Fedor Kazakov; 31.07.2015
comment
Ага. Я предполагаю, что вопрос касается проблемы с прокруткой. Если за окном появляются другие представления, похоже, что в вашей конфигурации есть какие-то другие ошибки. - person Martin Pfeffer; 31.07.2015
comment
Это действительно странно, я думаю, это ошибка Android, ваше решение, кажется, исправляет это, к сожалению, оно заставляет прокручивать представления за пределы окна, как говорит @FedorKazakov. - person Escobar5; 06.08.2015
comment
Хорошо, эту неправильную упаковку не должно быть слишком сложно исправить (может быть, в ближайшие часы я найду время, чтобы исправить это) - person Martin Pfeffer; 07.08.2015
comment
Я пытался сделать правильное исправление, но не смог. Новые классы от google слишком сложны. Вместо этого проще использовать RecyclerView. - person Fedor Kazakov; 07.08.2015
comment
На мой взгляд, сегодня (!) вся библиотека — это мусор. Я потратил много времени на поиск/исправление ошибок, и в итоге не получил должного результата. :-/ Может быть, это потому, что я не профессионал, но после обновления до 22.2.1 setIcon (новый Drawable) NavigationView больше не работает. Locgat тоже стреляет дерьмом... очень, очень странно. Может, надо дождаться 22.2.x(?)... - person Martin Pfeffer; 07.08.2015
comment
До 23.0.1 эта ошибка все еще существовала!! И нет исходников, которые очень сложно исправить. - person DouO; 14.09.2015

Похоже, та же проблема, что и здесь: Прокрутка не работает в NestedScrollView при попытке прокрутки из представлений с событиями щелчка

Это обходной путь для вашей проблемы https://stackoverflow.com/a/32887429/2165810

Но вы также должны использовать setPreventCornerOverlap(false) для CardView, чтобы избежать проблем с CardView.

person smbd uknow    schedule 01.10.2015

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

Мое решение состояло в том, чтобы добавить android:layout_marginBottom="100dp" к CardView, чтобы нижний край был за пределами экрана, что позволяло прокручивать.

person SoftWyer    schedule 15.02.2017