RecyclerView宽度有时为零(不确定)

时间:2018-05-08 10:57:31

标签: android android-recyclerview

我们已经检测到这个问题应该仅在某些特定情况下或者因为竞争条件而发生。不可复制,所以我们只在日志中有一些证据。

在应用中,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? 有没有办法强制重新绘制回收者视图?

注意:我们还检测到,如果用户旋转手机,则列表已正确加载。

感谢。

0 个答案:

没有答案