SwipeRefreshLayout拉入onRefresh事件

时间:2016-01-19 17:25:51

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

我正在尝试为RecyclerView实现向下滑动刷新小部件,但是我收到了一些奇怪的行为。以下是使用cardViews工作的recyclerView的样子。我已经在下面包含了XML视图定义:

enter image description here

问题:

刷新后,位于SwipeRefreshLayout视图( swipe_refresh_main )内的RecyclerView( recycler_view )不会填充任何cardViews:

enter image description here

只有在向下滚过第三个不可见项目后,才能看到cardViews。我相信这是因为RecyclerAdapter的工作原理,根据屏幕的可见性加载和卸载视图。这在我的情况下是有意义的,因为只有当第四个项目变得部分可见时,之前的cardViews也会出现。

enter image description here

我检查了之前和之后的视图层次结构,很明显刷新后包含cardViews的布局不存在:

布局预刷新(请注意包含可见cardViews的三种布局)

enter image description here

布局后刷新:(注意空的recyclerView)

enter image description here

我知道这与刷新侦听器如何响应滑动刷新操作有关,但我无法弄清楚为什么它不会在刷新之前重新显示视图。

刷新侦听器调用此方法:

@Override
public void showWordList(ArrayList<Word> wordArrayList){
    if(mWordRecyclerAdapter == null){
        mUnfilteredDataSet = wordArrayList;
        mWordRecyclerAdapter = new WordRecyclerAdapter(wordArrayList, this, this);
        mWordRecyclerAdapter.getFilter().filter(dataSetMode);
        recyclerView.setAdapter(mWordRecyclerAdapter);
    }else{
        mWordRecyclerAdapter.getFilter().filter(dataSetMode);
        recyclerView.setAdapter(mWordRecyclerAdapter);
    }
}

我的recyclerAdapter内部的filter方法根据选择的菜单项重建arrayList数据集。在这种情况下,对于刷新,arrayList保持不变:

getFilter方法:

@Override
public Filter getFilter() {
    Filter filter = new Filter(){
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mWordArrayList = (ArrayList<Word>)results.values;
            notifyDataSetChanged();
        }

我开始怀疑notifyDataSetChanged方法可能与此有关,但我不确定。我现在倾向于某种创可贴修复,例如强制视图滚动或重新加载的方法。任何的意见都将会有帮助。谢谢!

XML布局:

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<!--Main activity UI-->
    <RelativeLayout
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        tools:context=".HomeActivity"
        android:background="@color/material_grey_100">
        <android.support.v7.widget.Toolbar
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:fitsSystemWindows="true"
            android:minHeight="?attr/actionBarSize"
            android:background="@color/primary_material_light"
            android:elevation="4dp"
            android:theme="@style/Base.ThemeOverlay.AppCompat.Light"
            >
            <AutoCompleteTextView
                android:id="@+id/search_box"
                android:singleLine="true"
                android:gravity="center_vertical|left"
                android:layout_width="300dp"
                android:popupBackground="#ffff"
                android:layout_height="wrap_content"
                android:dropDownWidth="wrap_content"
                android:background="@android:color/transparent"
                android:visibility="gone"
                android:hint="Español o Inglés"
                android:completionThreshold="2"
                />
            <ImageView
                android:id="@+id/search_query_btn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:paddingLeft="16dp"
                android:paddingRight="4dp"
                android:src="@drawable/ic_magnify_grey600_24dp"
                />
            <ImageView
                android:id="@+id/search_clear_btn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:paddingLeft="16dp"
                android:paddingRight="16dp"
                android:visibility="invisible"
                android:src="@drawable/ic_close_grey600_36dp"
                />
        </android.support.v7.widget.Toolbar>

        <android.support.v4.widget.SwipeRefreshLayout
            android:layout_width="wrap_content"
            android:layout_below="@id/toolbar"
            android:layout_height="wrap_content"
            android:background="@color/cardview_dark_background"
            android:id="@+id/swipe_refresh_main">

            <!--Main CardView holder-->
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="4dp"
                android:scrollbars="vertical"/>

        </android.support.v4.widget.SwipeRefreshLayout>
        <!--Nav Fragments container-->
        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/toolbar"/>
    </RelativeLayout>
    <!--Drawer Nav UI-->
    <android.support.design.widget.NavigationView
        android:id="@+id/nav_drawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:divider="@android:color/transparent"
        android:background="@android:color/white"
        app:menu="@menu/drawer_view"
        app:headerLayout="@layout/nav_header"/>

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

0 个答案:

没有答案