我们已经检测到这个问题应该仅在某些特定情况下或者因为竞争条件而发生。不可复制,所以我们只在日志中有一些证据。
在应用中,Fragment
包含RecyclerView
,有时它完全空白。
内容正在后台线程中加载,然后在UI线程上刷新适配器。但RecyclerView
的宽度为零。因此,根本没有显示任何内容。
这是我初始化列表的方式:
private void initList() {
final int numberOfPreviewColumns = getResources().getInteger(R.integer.view_files_num_columns);
fileAdapter = initializeAdapter(numberOfPreviewColumns);
fileAdapter.setChoiceMode(getDefaultChoiceMode());
recyclerView.setHasFixedSize(true);
recyclerView.setOnCreateContextMenuListener(this);
// By posting to the RecyclerView the runnable is executed AFTER(!) the view has been drawn
recyclerView.post(new Runnable() {
@Override
public void run() {
int width = recyclerView.getWidth();
if (width <= 0) {
CriticalLogger.error("Error trying to set width to fileAdapter in FileManagerFragment: " + width);
}
}
});
layoutManager = new GridLayoutManager(getContext(), numberOfPreviewColumns) {
@Override
protected int getExtraLayoutSpace(State state) {
try {
return SplitTest.ExtraLayoutSpaceSize.getValueOrMiddleDefault();
} catch (Exception ignore) {
return 0;
}
}
};
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int i) {
return fileAdapter.shouldDivideInColumns() ? 1 : numberOfPreviewColumns;
}
});
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(fileAdapter);
}
适配器从ListAdapter
扩展而来,并包含方法submitList(List<V> items)
,每次获取新结果时都会调用该方法。
当然,RecyclerView
及其父级的XML是match_parent
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
android:orientation="vertical"
android:weightSum="1"
android:background="@drawable/gradient_fragment">
<RelativeLayout
android:id="@+id/layout_recyclerview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/layout_swipe_refresh"
style="@style/Container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/my_files_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:padding="1dp"
android:scrollbars="none"/>
...
问题是,为什么创建它时 RecyclerView 的宽度为0? 有没有办法强制重新绘制回收者视图?
注意:我们还检测到,如果用户旋转手机,则列表已正确加载。
感谢。