Android - 使用wrap_content高度的RecyclerView中的OnLoadMore

时间:2016-12-12 11:18:39

标签: android android-recyclerview recycler-adapter recyclerview-layout

我有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的替代方法是什么?

更新

RecyclerViewandroid:layout_height:"wrap_content"完美配合,我的ScrollView顺畅滚动。

更新2:

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

更新3

我在编写问题之前简化了xml ...在实际的xml中,有ViewPager而不是RecyclerView。我在ViewPager中有4个标签,每个标签都包含一个内容不同的RecyclerView

高于此ViewPager我有一些关于用户的信息,我想将所有这些信息一起滚动。因此,我将此标题和ViewPager放在ScrollView中,并将RecyclerView的高度设置为wrap_content

您可以查看Instagram的个人资料页面。我想这个页面就是这样的。

无法在RecyclerView的标头中显示此信息,因为这样,我应该在每个标签的每个RecyclerView中添加此信息。

2 个答案:

答案 0 :(得分:0)

<强>被修改

可以在scrollview中查找滚动事件

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

答案 1 :(得分:0)

您需要将ViewPagerRecyclerView保留在NestedScrollView内。最终的xml应该是这样的。

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

    <ViewPager/>
    <RecyclerView/>

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

并将RecyclerView的高度设置为match_parent

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

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

如果以上操作无效,请在nestedScrollView.scrollTo(0, 0);加载项目后尝试从代码设置RecyclerView