Прокручиваемый контент пейджера внутри проблемы NestedScrollView - PullRequest
0 голосов
/ 24 августа 2018

enter image description here

У меня есть просмотрщик внутри вложенного представления прокрутки, который может содержать или не содержать данные.Если он содержит данные, то это разбитое на два столбца представление сетки.Я хочу иметь возможность прокручиваться вниз достаточно далеко, где приведенный выше вид полностью скрыт, и я могу прокручивать просмотр в полноэкранном режиме.У меня проблема, когда данные загружаются, я могу только прокрутить немного больше.Похоже, что диапазон вложенной прокрутки увеличивается на высоту первого элемента, который появляется в представлении переработчика.Есть ли что-то, чего мне не хватает?

Вот что сейчас происходит: enter image description here

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

enter image description here

Я просто запутался в том, что именноздесь происходит

Вот XML для рассматриваемого представления

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/comment_layout_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/card_background">

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/comment_footer"
    android:scrollbars="none">

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

        <RelativeLayout
            android:id="@+id/image_frame"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/collection_image"
                android:layout_width="match_parent"
                android:layout_height="@dimen/item_detail_container_height"
                android:background="@color/color_black"
                android:scaleType="centerCrop"
                android:layout_centerInParent="true"
                />
            <Button
                style="@style/Button.LightPurple.Inverse"
                android:id="@+id/edit_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:layout_marginTop="10dp"
                android:layout_marginLeft="10dp"
                android:text="@string/collection_edit"
                android:visibility="gone"
                />
        </RelativeLayout>

        <include layout="@layout/item_detail_multi_nav_layout" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/color_list_divider" />


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:orientation="vertical">


            <TextView
                android:id="@+id/collection_title"
                android:layout_width="397dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginTop="@dimen/body_font_padding"
                android:gravity="center_vertical"
                android:text="@string/live_action_item_name"
                android:textColor="@color/on_board_clubs_join_btn"
                android:textSize="18sp" />

            <TextView
                android:id="@+id/collection_description"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginTop="@dimen/body_font_padding"
                android:autoLink="web"
                android:gravity="center_vertical"
                android:maxLines="3"
                android:text="@string/medal_item_description_placeholder"
                android:textColor="@color/color_dark_gray"
                android:textSize="14sp" />

            <TextView
                android:id="@+id/collection_item_count"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginTop="@dimen/body_font_padding"
                android:gravity="center_vertical"
                android:text="@string/item_collection_count"
                android:textAppearance="@style/TextAppearance.Large.Black.MontserratSemiBold"
                android:textColor="@color/search_follow_button"
                android:textSize="12sp" />

            <TextView
                android:id="@+id/collection_uploadedby"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginBottom="@dimen/body_font_padding"
                android:layout_marginTop="15dp"
                android:gravity="center_vertical"
                android:text="@string/item_uploaded_by"
                android:textAppearance="@style/TextAppearance.Large.Black.Montserrat" />

            <include layout="@layout/action_feed_header_for_uploadedby" />


        </LinearLayout>

        <android.support.design.widget.TabLayout
            android:id="@+id/tab_picker"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:elevation="0dp"
            app:tabPaddingStart="5dp"
            app:tabPaddingEnd="5dp"
            app:tabMinWidth="0dp"
            app:tabIndicatorColor="@color/colorAccent"
            app:tabIndicatorHeight="4dp"
            app:tabMode="scrollable"
            app:tabSelectedTextColor="@color/bpDark_gray"
            app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
            app:tabTextColor="@color/bpWhite" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/color_list_divider" />

        <com.gemr.android.widgets.misc.WrapContentViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/card_background"
            android:nestedScrollingEnabled="false"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

<LinearLayout
    android:id="@+id/comment_footer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_gravity="bottom"
    android:background="@color/card_background"
    android:orientation="vertical">

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/color_list_divider" />

    <LinearLayout
        android:id="@+id/comment_box_layout"
        style="@style/comment_box_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/bpWhite"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/comment_box"
            style="@style/comment_box_text"
            android:layout_width="0dp"
            android:layout_height="@dimen/comment_text_box_height"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:background="@drawable/edit_text_post"
            android:gravity="center_vertical"
            android:hint="@string/comment_box_hint"
            android:inputType="textCapSentences|textMultiLine"
            android:maxLines="3"
            android:selectAllOnFocus="true" />

        <TextView
            android:id="@+id/comment_post"
            android:layout_width="wrap_content"
            android:layout_height="35dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:background="@drawable/card_view_selector"
            android:gravity="center_vertical"
            android:padding="4dp"
            android:text="@string/comment_post"
            android:textAppearance="@style/TextAppearance.Large.Gray.Montserrat" />

    </LinearLayout>
</LinearLayout>

А вот RecyclerView, настроенный с помощью пейджера:

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/card_background">

<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipeContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/feed_recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:itemCount="3"/>

</android.support.v4.widget.SwipeRefreshLayout>

<include layout="@layout/fab_layout" />

Я пропускаю что-то очень простое?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Проблема в том, что Recyclerview установлен на match_parent. Там его размер будет равен размеру экрана минус размер всех остальных вещей в NestedScrollView вместе взятых.

В устройстве, которому требуется весь экран, чтобы вместить другие элементы в NestedScrollView, размер Recyclerview будет даже равен 0.

Шаг 1:
Измените рост Recyclerview и его родителей (SwipeRefreshLayout и FrameLayout) на wrap_content.

Шаг 2:
Если это не работает должным образом, установите фиксированный размер на Recyclerview (только на Recyclerview, и родители должны остаться wrap_content).

Шаг 3:
Если вы хотите, чтобы он работал точно так, как показано на рисунке, я думаю, вам нужно рассчитать размер во время выполнения. В этом случае вы можете отменить шаг 2.

0 голосов
/ 24 августа 2018

Почему бы вам не попробовать комбинацию Coordinate Layout и AppBarLayout, чтобы добиться этого. Это намного проще. Вы можете проверить эту ссылку для различных свитков.

https://github.com/codepath/android_guides/wiki/Handling-Scrolls-with-CoordinatorLayout

Эта ссылка показывает, что именно вы хотите достичь

https://gist.github.com/iPaulPro/1468510f046cb10c51ea

0 голосов
/ 24 августа 2018

Попробуйте, может быть, это вам поможет

public class CustomNestedScrollView extends NestedScrollView {
private int slop;
private float mInitialMotionX;
private float mInitialMotionY;

public CustomNestedScrollView(Context context) {
    super(context);
    init(context);
}

private void init(Context context) {
    ViewConfiguration config = ViewConfiguration.get(context);
    slop = config.getScaledEdgeSlop();
}

public CustomNestedScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

public CustomNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context);
}


private float xDistance, yDistance, lastX, lastY;

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    final float x = ev.getX();
    final float y = ev.getY();
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            xDistance = yDistance = 0f;
            lastX = ev.getX();
            lastY = ev.getY();

            // This is very important line that fixes
            computeScroll();


            break;
        case MotionEvent.ACTION_MOVE:
            final float curX = ev.getX();
            final float curY = ev.getY();
            xDistance += Math.abs(curX - lastX);
            yDistance += Math.abs(curY - lastY);
            lastX = curX;
            lastY = curY;

            if (xDistance > yDistance) {
                return false;
            }
    }


    return super.onInterceptTouchEvent(ev);
}

}

...