问题描述
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的IdfloatingActionButton.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); }}
注:initView在onCreateView中 initData在onActivityCreated当中
注释掉的那两句话
if (isConnected) new LoadNewsTask(adapter).execute(); else Utility.noNetworkAlert(mActivity);
之前可以完美允许 但是想添加个SwipeRefreshLayout进行下拉刷新后的加载 但是 Toast打印出来了就是加载不出来数据请问有人知道什么缘故吗
问题解答
回答1:添加完数据之后调用adapter.notifyiteminserted()才能显示出来
回答2:你要明白new Handler().postDelayed()的原理,它只是一个定时任务,根据你的设置postDelayed()中的代码只是延迟了1秒执行,但程序先执行的还是mRecyclerView.setAdapter(adapter);所以此时你要加载的数据还没有进行加载。就更别说更新数据了。你应该把mRecyclerView.setAdapter(adapter);放到postDelayed()中。此外网络请求都是费时的,需要是异步执行,要更新数据都是在获取数据成功后的回调方法中执行。
回答3:你在Toast下面加一句 notifiydatasetchanged 就可以了,楼上的答案也是正确的。异步操作 直接new Thread 就行了 别用这个new Handler().postDelayed()了。
回答4:adapter的数据没有刷新,主线程分出去一个线程执行post,但是主线程不会停下来,在子线程执行Post的时候,他其实已经执行过setadapter了。但是当时数据还没回来。
回答5:在这里面 LoadNewsTask 更新adapter就行了 即使你没有用handler.post 那两句话没有注释掉 也不一定是完美运行的。如果网络数据请求过慢,数据同样不一定会显示。