찾다

 >  Q&A  >  본문

android - SwipeRefreshLayout的onRefresh的方法

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打印出来了就是加载不出来数据
请问有人知道什么缘故吗

天蓬老师天蓬老师2772일 전753

모든 응답(5)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-17 17:45:07

    데이터를 추가한 후, Adapter.notifyiteminserted()를 호출하여 표시하세요

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 17:45:07

    new Handler().postDelayed()의 원리를 이해해야 합니다. 설정에 따르면 postDelayed()의 코드는 1초만 지연되지만 프로그램이 먼저 실행됩니다mRecyclerView.setAdapter(adapter);. 지금 로드해야 합니다. 데이터가 아직 로드되지 않았습니다. 데이터 업데이트는 말할 것도 없습니다. mRecyclerView.setAdapter(adapter); 안에 postDelayed()를 넣어야 합니다.
    또한 네트워크 요청은 시간이 많이 걸리고 비동기적으로 실행되어야 합니다. 데이터를 업데이트하려면 데이터를 성공적으로 가져온 후 콜백 메서드에서 실행됩니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 17:45:07

    토스트 아래에 "notifiydatasetchanged"라는 문장을 추가하면 됩니다. 위의 답변도 맞습니다. 비동기 작업의 경우 새 Thread를 사용하세요. new Handler().postDelayed()를 사용하지 마세요.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 17:45:07

    어댑터의 데이터는 새로 고쳐지지 않습니다. 메인 스레드는 포스트를 실행하기 위해 스레드를 분리하지만, 하위 스레드가 포스트를 실행하면 실제로는 setadapter가 실행됩니다. 하지만 아직 데이터가 돌아오지 않았습니다.

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 17:45:07

    여기 LoadNewsTask에서 어댑터를 업데이트하세요.
    handler.post를 사용하지 않고 해당 두 문장이 주석 처리되지 않은 경우에도 완벽하게 실행되지 않을 수도 있습니다. 네트워크 데이터 요청 속도가 너무 느리면 데이터가 표시되지 않을 수 있습니다.

    회신하다
    0
  • 취소회신하다