最近用fragment+viewpager来做多页面联网加载数据的功能,本来也觉得没什么,可是就是有很多问题,比如页面切换后就没有数据显示了,预加载数据很费流量问题,所以在这里记录一下,以后省的每次都去解决这种问题了。贴出所有代码,方法是按照fragment的生命周期写的。(url就自己写吧)
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import com.google.gson.Gson;
import com.hawk.android.hicamera.adapter.MaterialAdapter;
import com.hawk.android.hicamera.bean.Data;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import okhttp3.Call;
/**
* Created by lenovo on 2016/11/7.
*/
public class MaterialFragment extends Fragment {
private static final String url = "";
private RecyclerView mRecyclerView;
private Data mData;//联网得到的数据
private MaterialAdapter mMaterialAdapter;
private String mTitle;
private ProgressBar mProgressBar;
public static MaterialFragment getInstance(String title) {
MaterialFragment materialFragment = new MaterialFragment();
Bundle bundle = new Bundle();
bundle.putString("title", title);
materialFragment.setArguments(bundle);
return materialFragment;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isVisible()) {//视图可见并且控件准备好了,每次都会调用
if (null == mData) {//如果数据为空了,则需要重新联网请求
loadDataFromNet();
}
}
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTitle = getArguments().getString("title");
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_material, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
mProgressBar = (ProgressBar) view.findViewById(R.id.pb_material);
mRecyclerView = (RecyclerView) view.findViewById(R.id.rv_material);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this.getContext(), LinearLayoutManager.VERTICAL, false));
mRecyclerView.setHasFixedSize(true);
mMaterialAdapter = new MaterialAdapter(this);
mRecyclerView.setAdapter(mMaterialAdapter);
if (null == mData && getUserVisibleHint()) {
loadDataFromNet();//解决第一个fragment无法加载数据问题
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (null != mData && null != mMaterialAdapter) {//解决切换后闪屏已经无数据显示问题
mMaterialAdapter.notifyData(mData.data.filmRecommends);
}
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
OkHttpUtils.getInstance().cancelTag(this);
mProgressBar.setVisibility(View.GONE);
}
/**
* 加载数据
*/
private void loadDataFromNet() {
mProgressBar.setVisibility(View.VISIBLE);
OkHttpUtils
.get()
.url(url)
.tag(this)
.addParams("deviceId", "b0e8cc2f-6098-3596-b580-d76f30850f69")
.addParams("appToken", "6558E6B7CB1741BDC79A93FB1C9B629DB18B4D434824B99729783976ECB42C6A573AD5F1F73DEF0383F968C8EACA2096")
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
}
@Override
public void onResponse(String response, int id) {
Gson gson = new Gson();
mData = gson.fromJson(response, Data.class);
if (null != mData) {
mMaterialAdapter.notifyData(mData.data.filmRecommends);
mProgressBar.setVisibility(View.GONE);
}
}
});
}
}
xml文件如下<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_material"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"/>
<ProgressBar
android:id="@+id/pb_material"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
</FrameLayout>
对了,viewpager的adaper也贴出来吧;
public class MaterialStoreAdapter extends FragmentPagerAdapter {
private ArrayList<MaterialFragment> mFragments;
public MaterialStoreAdapter(FragmentManager fm, ArrayList<MaterialFragment> fragments) {
super(fm);
this.mFragments = fragments;
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments == null ? 0 : mFragments.size();
}
}
下次再遇到这个问题,直接过来复制粘贴就ok了。。。
参考文章地址:http://www.cnblogs.com/wangfeng520/p/5807465.html