我正在尝试为RecyclerView实现向下滑动刷新小部件,但是我收到了一些奇怪的行为。以下是使用cardViews工作的recyclerView的样子。我已经在下面包含了XML视图定义:
问题:
刷新后,位于SwipeRefreshLayout视图( swipe_refresh_main )内的RecyclerView( recycler_view )不会填充任何cardViews:
只有在向下滚过第三个不可见项目后,才能看到cardViews。我相信这是因为RecyclerAdapter的工作原理,根据屏幕的可见性加载和卸载视图。这在我的情况下是有意义的,因为只有当第四个项目变得部分可见时,之前的cardViews也会出现。
我检查了之前和之后的视图层次结构,很明显刷新后包含cardViews的布局不存在:
布局预刷新(请注意包含可见cardViews的三种布局)
布局后刷新:(注意空的recyclerView)
我知道这与刷新侦听器如何响应滑动刷新操作有关,但我无法弄清楚为什么它不会在刷新之前重新显示视图。
刷新侦听器调用此方法:
@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>