CoordinatorLayout + SwipeRefreshLayout + Endless RecyclerView的奇怪行为

时间:2016-02-15 19:13:05

标签: android android-layout android-recyclerview android-coordinatorlayout

我尝试使用崩溃的CoordinatorLayout来实施ToolBar。我已经内置SwipeRefreshLayout RecyclerView了。此回收站视图还有onScrollListener可加载更多内容,自定义适配器可在加载更多内容时显示加载ViewHolder

在尝试添加CoordinatorLayout之前,一切正常。现在我有两个问题:

  1. 首次加载项目时,加载ViewHolder会显示,并且放置得很好(ToolBar下方)。完成后,将移除装载并添加项目。问题是第一个项目是隐藏的。它就像第二个项目实际上是第一个项目。即使第一个项目大于ToolBar,也完全看不到第一个项目。但是当我使用滑动刷新时,项目会正确放置。我不知道为什么会这样。

  2. 当我使用滑动刷新时,它会加载项目两次。第一次是正常加载,第二次是因为onScrollListener而导致更多项目的加载。但是滚动仍然在列表的顶部。在我滚动之前,回收者视图项保持不可见(我认为这是因为我只通知适配器新项目,但我们仍然在列表的顶部)。

  3. 但是,我不知道在听众中要改变什么来解决这个问题。

    以下是听众:

        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if(!adapter.isLoading()) {
                    LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                    //position starts at 0
                    if (layoutManager.findLastCompletelyVisibleItemPosition() >= layoutManager.getItemCount() - 2) {
                        loadSubmissions(false);
                    }
                }
            }
        });
    

    我的活动布局:

    <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/coordinatorLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/appBarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <include
                android:id="@+id/toolbar"
                layout="@layout/toolbar" />
    
        </android.support.design.widget.AppBarLayout>
    
        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/contentView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipToPadding="false"
                android:paddingBottom="6dp"
                android:paddingTop="6dp"
                android:scrollbars="vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
        </android.support.v4.widget.SwipeRefreshLayout>
    
    </android.support.design.widget.CoordinatorLayout>
    

    我的工具栏:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.Toolbar
        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="wrap_content"
        android:background="@color/colorPrimary"
        android:elevation="4dp"
        app:layout_scrollFlags="scroll|enterAlways">
    </android.support.v7.widget.Toolbar>
    

1 个答案:

答案 0 :(得分:0)

这两个问题都已解决。对于第一个,当我删除加载的ViewHolder时,我实际上正在notifyItemInserted而不是notifyItemRemoved

对于第二个问题,因为当我使用滑动刷新时,我正在调用notifyDatasetChanged

@Override public void onRefresh() {
    adapter.clear();
    adapter.notifyDataSetChanged();
    loadSubmissions(true);
}

当我用刷卡清除适配器进行刷新时,我正在滑动,这意味着将调用onScrollListener。

我更改了监听器并添加了验证,如果没有项目,则不加载更多。

mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(linearLayoutManager) {
    @Override
    public void onLoadMore(int current_page) {
        // Doesnt load multiples times with the same scroll and doesnt load if there are no items
        if(!adapter.isLoading() && adapter.getItemCount() > 0) {
            loadSubmissions(false);
        }
    }
});