android - SwipeRefreshLayout的onRefresh的方法

 保定联通员工 发布于 2022-10-30 22:23
public class RvList extends BaseFragment {

    private boolean isConnected;
    public RecyclerView mRecyclerView;
    private FloatingActionButton floatingActionButton;
    private SwipeRefreshLayout swipeRefreshWidget;
    private RvAdapter adapter;

    @Override
    protected View initView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view= inflater.inflate(R.layout.viewpager_rv, container, false);
        mRecyclerView = (RecyclerView) view.findViewById(R.id.rv);
        swipeRefreshWidget = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_widget);
        swipeRefreshWidget.setColorSchemeResources(R.color.colorPrimaryDark, R.color.colorAccent,R.color.colorPrimary);//setColorSchemeResources():设置进度条的颜色主题,最多设置四种
        floatingActionButton = (FloatingActionButton) view.findViewById(R.id.fab);//FloatingActionButton的Id
        floatingActionButton.setOnClickListener(new View.OnClickListener() {//FAB的点击事件
            @Override
            public void onClick(View v) {
                mRecyclerView.smoothScrollToPosition(0);
            }
        });
        mRecyclerView.setLayoutManager(new LinearLayoutManager(mActivity,LinearLayoutManager.VERTICAL,false));
        return view;
    }

    @Override
    protected void initData() {
        isConnected = Utility.checkNetworkConnection(mActivity);
        adapter = new RvAdapter(mActivity);
        swipeRefreshWidget.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (isConnected) {
                            new LoadNewsTask(adapter).execute();
                            Toast.makeText(mActivity, "刷新完成", Toast.LENGTH_SHORT).show();
                            swipeRefreshWidget.setRefreshing(false);
                        } else {
                            Utility.noNetworkAlert(mActivity);
                            swipeRefreshWidget.setRefreshing(false);//设置SwipeRefreshLayout当前是否处于刷新状态,一般是在请求数据的时候设置为true,在数据被加载到View中后,设置为false。
                        }
                    }
                },1000);
            }
        });
/*        if (isConnected) new LoadNewsTask(adapter).execute();
        else Utility.noNetworkAlert(mActivity);*/
        mRecyclerView.setAdapter(adapter);
    }
}

注:initViewonCreateViewinitDataonActivityCreated当中

注释掉的那两句话

if (isConnected) new LoadNewsTask(adapter).execute(); else Utility.noNetworkAlert(mActivity);

之前可以完美允许
但是想添加个SwipeRefreshLayout进行下拉刷新后的加载 但是 Toast打印出来了就是加载不出来数据
请问有人知道什么缘故吗

5 个回答
  • 在这里面 LoadNewsTask 更新adapter就行了
    即使你没有用handler.post 那两句话没有注释掉 也不一定是完美运行的。如果网络数据请求过慢,数据同样不一定会显示。

    2022-10-31 22:03 回答
  • adapter的数据没有刷新,主线程分出去一个线程执行post,但是主线程不会停下来,在子线程执行Post的时候,他其实已经执行过setadapter了。但是当时数据还没回来。

    2022-10-31 22:03 回答
  • 你在Toast下面加一句 notifiydatasetchanged 就可以了,楼上的答案也是正确的。异步操作 直接new Thread 就行了 别用这个new Handler().postDelayed()了。

    2022-10-31 22:03 回答
  • 你要明白new Handler().postDelayed()的原理,它只是一个定时任务,根据你的设置postDelayed()中的代码只是延迟了1秒执行,但程序先执行的还是mRecyclerView.setAdapter(adapter);所以此时你要加载的数据还没有进行加载。就更别说更新数据了。你应该把mRecyclerView.setAdapter(adapter);放到postDelayed()中。
    此外网络请求都是费时的,需要是异步执行,要更新数据都是在获取数据成功后的回调方法中执行。

    2022-10-31 22:03 回答
  • 添加完数据之后调用adapter.notifyiteminserted()才能显示出来

    2022-10-31 22:03 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有