viewpager+fragment聯網載入資料無顯示以及預載入問題解決
阿新 • • 發佈:2019-02-12
最近用fragment+viewpager來做多頁面聯網載入資料的功能,本來也覺得沒什麼,可是就是有很多問題,比如頁面切換後就沒有資料顯示了,預載入資料很費流量問題,所以在這裡記錄一下,以後省的每次都去解決這種問題了。貼出所有程式碼,方法是按照fragment的生命週期寫的。(url就自己寫吧)
xml檔案如下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); } } }); } }
對了,viewpager的adaper也貼出來吧;<?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>
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