viewpager+fragmentリロード操作
3259 ワード
プロジェクトでtablayout+viewpager+fragmentの組み合わせを使用するのも、現在appで非常に流行しているデザインです.
viewpagerがページを切り替える際、fragmentに怠惰なロード操作をさせることは、比較的良い体験であり、トラフィックを節約し、プリロード時のカートン現象を避ける.
リロード操作は主にfragmentのsetUserVisibleHint()およびgetUserVisibleHint()メソッドに使用されます.
setUserVisibleHint()メソッドはviewpageradapterの内部で呼び出され、fragmentに対してfalseとして割り当てられます.逆にtrue.
getUserVisibleHint()メソッドは、この値を取得する、fragmentが現在表示されているか否かによってデータのロード操作を行うことで、プリロード機能を実現する.
viewpagerがページを切り替える際、fragmentに怠惰なロード操作をさせることは、比較的良い体験であり、トラフィックを節約し、プリロード時のカートン現象を避ける.
リロード操作は主にfragmentのsetUserVisibleHint()およびgetUserVisibleHint()メソッドに使用されます.
setUserVisibleHint()メソッドはviewpageradapterの内部で呼び出され、fragmentに対してfalseとして割り当てられます.逆にtrue.
getUserVisibleHint()メソッドは、この値を取得する、fragmentが現在表示されているか否かによってデータのロード操作を行うことで、プリロード機能を実現する.
package cn.cibn.haokan.ui.categoryList;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import cn.cibn.haokan.ui.base.ImgBaseFragment;
public abstract class LazyFragment extends ImgBaseFragment{
/**
* Fragment title
*/
public String fragmentTitle;
/**
*
*/
private boolean isVisible;
/**
* ,View 。
* 2016/04/29
* isAdded()
* 2016/05/03
* isPrepared ,isAdded onCreateView isAdded
*/
private boolean isPrepared;
/**
*
*/
private boolean isFirstLoad = true;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// viewpager setOffscreenPageLimit
// Fragment onCreateView ( )
// initData ,
// isFirstLoad = true;
// 2016/04/29
// isFirstLoad = true , initData
// onCreateView FragmentManager initData .
// Bug initViews list.clear();
isFirstLoad = true;
View view = initViews(inflater, container, savedInstanceState);
isPrepared = true;
lazyLoad();
return view;
}
/**
* ViewPager , setUserVisibleHint
*
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
/**
* FragmentTransaction show hide , onHiddenChanged.
* show Fragment hide show
*
* @param hidden hidden True if the fragment is now hidden, false if it is not
* visible.
*/
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
protected void onVisible() {
lazyLoad();
}
protected void onInvisible() {
}
/**
* Fragment , onCreateView
* isPrepared = true;
*/
protected void lazyLoad() {
if (isPrepared && isVisible && isFirstLoad) {
isFirstLoad = false;
initData();
}
}
protected abstract View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
protected abstract void initData();
}