相见恨晚的函数:setUserVisibleHint()实现 fragment 对用户可见时才加载资源(延迟加载)。

来源:互联网 发布:网络嗅探器使用教程 编辑:程序博客网 时间:2024/06/03 20:34

最近知道viewpager有缓存机制,但是我的fragment中有动画,一缓存切换时效果就没出,怎么办???

遇上这个问题我第一想到的是消除缓存,网上有很多资料,但最后试了都不是很理想。最后遇上一位大神,才知道有懒加载的方法。

1.首先写个lazyfragment作为基类

public abstract class LazyFragment extends Fragment { protected boolean isVisible;    /**     * 在这里实现Fragment数据的缓加载.     * @param isVisibleToUser     */    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if(getUserVisibleHint()) {            isVisible = true;            onVisible();        } else {            isVisible = false;            onInvisible();        }    }    protected void onVisible(){        lazyLoad();    }    protected abstract void lazyLoad();    protected void onInvisible(){}}
2.在你需要延长的地方实现懒加载

public class MovieListFragment extends LazyFragment {   private boolean isPrepared;  private MovieAdapter adapter = null;        private List<Movie> movieList;      private ListView movieListView;    @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);                   }        @Override      public View onCreateView(LayoutInflater inflater, ViewGroup container,              Bundle savedInstanceState) {              View v = inflater.inflate(R.layout.movie_list_fragment,null);          movieListView = (ListView) v.findViewById(R.id.lv_movie);         isPrepared = true;        lazyLoad();                return v;      }      //懒加载    @Override    protected void lazyLoad() {    // TODO Auto-generated method stub     if(!isPrepared || !isVisible) {             return;         }         //填充各控件的数据     movieInit();     adapter = new MovieAdapter(getActivity(), R.layout.movie_item, movieList);          movieListView.setAdapter(adapter);        movieListView.setLayoutAnimation(new ListAnim().getListAnim());    }        




0 0