3

我有RecyclerView它的高度设置为wrap_content。现在我需要实施OnLoadMore它,但有一个问题。我用了,

RecyclerView.OnScrollListener.onScrolled(RecyclerView recyclerView, int dx, int dy)

但它不会被调用,因为我RecyclerView的不滚动。它的高度是wrap_content

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_rtl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

    <include
        android:id="@+id/tool_bar"
        layout="@layout/toolbar" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/tool_bar">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            tools:context="com.yarima.msn.Activities.ProfileActivity">

            <FrameLayout
                 android:id="@+id/FRAGMENT_PLACEHOLDER"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:background="@color/white">

                 <!-- Some Content That I want to scroll with recyclerview -->
            </FrameLayout>

            <android.support.v7.widget.RecyclerView
                 android:id="@+id/recyclerview_posts"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:scrollbars="vertical"
                 android:bellow="@id/FRAGMENT_PLACEHOLDER"/>
        </RelativeLayout>
    </ScrollView>

</RelativeLayout>

所以我需要使用另一种方法将更多页面加载到RecyclerView. 我认为最好的方法是onLoadMore在最后一项RecyclerView可见时调用事件。我已经尝试从onBindViewHolder适配器中的方法执行此操作,但所有页面都加载了。

if(getItemCount()-position == 1 && onLoadMoreListener != null){
    if (recyclerView != null) {
        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = recyclerView.getLayoutManager().getItemCount();
        firstVisibleItem = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading && (totalItemCount - visibleItemCount)
                <= (firstVisibleItem + visibleThreshold)) {
            loading = true;
            onLoadMoreListener.onLoadMore();
        }
    }
}

onLoadMore不使用滚动事件的替代方法是什么?

更新:

RecyclerView完美配合android:layout_height:"wrap_content",我的卷轴ScrollView也很流畅。

更新 2:

我的问题是当您的RecyclerView身高为时,无法调用wrap_content滚动事件。RecyclerView所以我需要一种替代方法来找出我何时RecyclerView到达其列表的末尾并以OnLoadMore这种方式实施事件。

更新 3

我在写问题之前简化了 xml……在真正的 xml 中,有ViewPager而不是RecyclerView. 我有 4 个选项卡ViewPager,每个选项卡都包含一个RecyclerView不同的内容。

在此之上,ViewPager我有一些关于用户的信息,我想将所有这些信息一起滚动。所以我把这个标题ViewPager放在 a 中ScrollView,并将高度设置RecyclerViewwrap_content

您可以查看 instagram 的个人资料页面。我希望这个页面像那样工作。

无法在标题中显示此信息,RecyclerView因为通过这种方式,我应该RecyclerView在每个选项卡的每个选项卡中添加此信息。

4

2 回答 2

0

您需要将您的ViewPager和您的RecyclerView内部保持在一个NestedScrollView. 最终的 xml 应该如下所示。

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ViewPager/>
    <RecyclerView/>

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

并将您的高度设置RecyclerViewmatch_parent.

你会在这里面临另一个问题。RecyclerView加载时页面会自动滚动到底部。但也有解决方案。

添加android:descendantFocusability="blocksDescendants"到子布局NestedScrollView中将防止自动滚动到底部。

如果上述方法不起作用,请在加载项目nestedScrollView.scrollTo(0, 0);后尝试从代码中进行设置。RecyclerView

于 2016-12-15T15:26:21.950 回答
0

已编辑

可以在滚动视图中查找滚动事件

https://developer.android.com/reference/android/view/View.html#onScrollChanged(int , int, int, int)

于 2016-12-12T11:21:35.843 回答