scwang90 / SmartRefreshLayout

🔥下拉刷新、上拉加载、二级刷新、淘宝二楼、RefreshLayout、OverScroll,Android智能下拉刷新框架,支持越界回弹、越界拖动,具有极强的扩展性,集成了几十种炫酷的Header和 Footer。
https://segmentfault.com/a/1190000010066071
Apache License 2.0
24.96k stars 4.96k forks source link

AutoRefresh 方法结束后视图状态不对 #1409

Open yizems opened 3 years ago

yizems commented 3 years ago

image

当使用autoRefresh() 后, 先调用finishRefresh() , 后调用 adapter.notifyDataSetChanged() 会出现这种情况

如果先调用adapter.notifyDataSetChanged() 后调用finishRefresh() 就没有问题

配置: androidx

    implementation 'com.scwang.smart:refresh-layout-kernel:2.0.3' 
    implementation 'com.scwang.smart:refresh-header-classics:2.0.3'
    implementation 'com.scwang.smart:refresh-footer-classics:2.0.3'
    <com.scwang.smart.refresh.layout.SmartRefreshLayout
        android:id="@+id/layout_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <com.scwang.smart.refresh.header.ClassicsHeader
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycleview"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </androidx.recyclerview.widget.RecyclerView>
        <com.scwang.smart.refresh.footer.ClassicsFooter
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
scwang90 commented 3 years ago

我在Smart 的 demo 中尝试两种方法重现这个错误,都失败了。 方式一

mRefreshLayout.autoRefresh();//开始刷新数据时无数据
        mClassicsHeader.setFinishDuration(0);//关闭Header的完成延时
        mRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
                //刷新启动一秒后 关闭刷新并加载数据
                refreshLayout.getLayout().postDelayed(()->{
                    refreshLayout.finishRefresh();
                    List<Item> items = new ArrayList<>();
                    items.addAll(Arrays.asList(Item.values()));
                    items.addAll(Arrays.asList(Item.values()));
                    mAdpater.refresh(items);
                }, 2000);
            }
        });

方式二

mRefreshLayout.autoRefresh();//开始刷新数据时无数据
        mClassicsHeader.setFinishDuration(0);//关闭Header的完成延时
        mRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
                //刷新启动一秒后 关闭刷新
                refreshLayout.getLayout().postDelayed(()->{
                    refreshLayout.finishRefresh();
                }, 1000);
                //启动刷新两秒后 添加数据
                refreshLayout.getLayout().postDelayed(()->{
                    List<Item> items = new ArrayList<>();
                    items.addAll(Arrays.asList(Item.values()));
                    items.addAll(Arrays.asList(Item.values()));
                    mAdpater.refresh(items);
                }, 2000);
            }
        });

建议先 notifyDataSetChanged 再 finishRefresh

如果你希望能解决这个问题并且有时间,可以新建一个 demo 项目,重现这个问题,并发邮件给我。

yizems commented 3 years ago

好的, 回头我新建项目看看能不能复现这个问题