web-dev-qa-db-ja.com

スクロールビュー内のViewPager内のRecyclerviewが機能しない

次のビューを持つxmlレイアウトがありますScrollview-> RelativeLayout-> Some Views + Tablayout + ViewPager-> Recylerview(In Fragment of ViewPager)。 ViewPagerの高さは固定されています(保持すると"Wrap_Content"はまったく表示されません)。問題は、Recylerviewがスクロールしないことです。 "Nested Scrollview"またはLinearLayoutの子を作成するなど、すでに投稿されているいくつかのソリューションを試しました。しかし、何も機能しませんでした。

以下は私のxmlです:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent">

    <Android.support.v4.widget.NestedScrollView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_above="@+id/btn_startdraw"
        Android:fillViewport="true"
        Android:gravity="center">

        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:gravity="center"
            Android:padding="@dimen/_5sdp">


            <TextView
                Android:id="@+id/invites_accepted"
                style="@style/bodyStyleBlue"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/committee_slots"
                Android:text="@string/invites_accepted" />

               <!-- A lot of other Textfields for data display-->

                <Android.support.design.widget.TabLayout
                Android:id="@+id/tabs_pendingcommittee"
                style="@style/TabStyle"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/draw_mode_val"
                app:tabMode="fixed"></Android.support.design.widget.TabLayout>b


            <com.apponative.committeeapp.ui.custom.CustomViewPager
                Android:id="@+id/pending_member_view"
                Android:layout_width="match_parent"
                Android:layout_height="@dimen/_250sdp"
                Android:layout_below="@+id/tabs_pendingcommittee"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />

        </RelativeLayout>
    </Android.support.v4.widget.NestedScrollView>

    <!-- Some other views on bottom-->
</RelativeLayout>

また、Viewpagerが表示しているフラグメントには、次のレイアウトxmlがあります。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@color/white">

    <TextView
        style="@style/bodyStyleBold1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="No People..." />

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/contact_list"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/title"
        Android:background="@color/white"></Android.support.v7.widget.RecyclerView>
</FrameLayout>

RecyclerviewでnestedScrollingEnabledおよびsetFixedHeightプロパティを使用してみました。しかし、n何も機能しませんでした。

13
Saira Nawaz

問題はRecyclerView inside ViewPagerまたはScrollViewではないことがわかりましたが、問題はViewPager inside- ScrollViewViewPagerScrollViewそのWrap_Contentプロパティが機能していなかったため、高さが固定されているため、RecyclerViewコンテンツが完全に表示されるように制限されています。そこで、この問題をViewPagerのonMeasureをカスタマイズするメソッドで解決しました。これはスムーズに機能します。 NestedScrollビューまたは他の特定のソリューションでラップする必要はありません。

以下は、子としてScrollViewに追加されたときにコンテンツをラップするCustomViewPagerのコードです。

public class CustomViewPager extends ViewPager {

    boolean canSwipe = true;

    public CustomViewPager(Context context) {
        super(context);
    }

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        View child = getChildAt(getCurrentItem());
        if (child != null) {
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void canSwipe(boolean canSwipe) {
        this.canSwipe = canSwipe;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.canSwipe) {
            return super.onTouchEvent(event);
        }

        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (this.canSwipe) {
            return super.onInterceptTouchEvent(event);
        }

        return false;
    }
}
14
Saira Nawaz

NestedScrollViewを追加し、次にrecyclerView.setNestedScrollingEnabled(false);を設定します

すでにこれを持っていることを確認してくださいAndroid.support.v7.widget.RecyclerView

RecyclerView要素には独自のスクローラーがあることに注意してください

 <Android.support.v7.widget.RecyclerView
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content" />

ScrollViewをAndroid.support.v4.widget.NestedScrollViewに置き換えると、すべてのバージョンで機能します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent">

    <Android.support.v4.widget.NestedScrollView
        style="@style/ScrollBarStyle"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_above="@+id/btn_startdraw"
        Android:fillViewport="true"
        Android:gravity="center">

        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:gravity="center"
            Android:padding="@dimen/_5sdp">


            <TextView
                Android:id="@+id/invites_accepted"
                style="@style/bodyStyleBlue"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/committee_slots"
                Android:text="@string/invites_accepted" />

               <!-- A lot of other Textfields for data display-->

                <Android.support.design.widget.TabLayout
                Android:id="@+id/tabs_pendingcommittee"
                style="@style/TabStyle"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/draw_mode_val"
                app:tabMode="fixed"></Android.support.design.widget.TabLayout>b


            <com.apponative.committeeapp.ui.custom.CustomViewPager
                Android:id="@+id/pending_member_view"
                Android:layout_width="match_parent"
                Android:layout_height="@dimen/_250sdp"
                Android:layout_below="@+id/tabs_pendingcommittee"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />

        </RelativeLayout>
    </Android.support.v4.widget.NestedScrollView>

    <!-- Some other views on bottom-->
</RelativeLayout>

私はそれがうまくいくことを願っています! :)それが機能しない場合は、私に知らせてください!私はそれが機能していない理由を理解しようとします:)良い一日を!

0
Cristofer