1. 程式人生 > >Android實現ViewPager滑動播放視訊,ViewPager+Fragment取消懶載入問題

Android實現ViewPager滑動播放視訊,ViewPager+Fragment取消懶載入問題

1.首先:

設定ViewPager的verticalViewPager.setOffscreenPageLimit(0),發現無效,但是原始碼中確實設定0之後預設的是0,然而你滑動的時候發現當前的視訊在播放而下一條也會播放。

2.解決 :

public abstract class LazyLoadFragment extends Fragment {
    @Bind(R.id.img_detail_image)
    TouchImagView imgDetailImage;
    @Bind(R.id.voice)
    ImageView voice;
    @Bind(R.id.pause)
    ImageView pause;
    @Bind(R.id.img_detail_video)
    CustomVideoView imgDetailVideo;
    /**
     * 檢視是否已經初初始化
     */
    protected boolean isInit = false;
    protected boolean isLoad = false;
    protected final String TAG = "LazyLoadFragment";
    private View view;
    private HttpProxyCacheServer proxy;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(setContentView(), container, false);
        GuiceHelper.bind(this,view);
        isInit = true;
        /**初始化的時候去載入資料**/
        isCanLoadData();
        return view;
    }

    /**
     * 檢視是否已經對使用者可見,系統的方法
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isCanLoadData();
    }

    /**
     * 是否可以載入資料
     * 可以載入資料的條件:
     * 1.檢視已經初始化
     * 2.檢視對使用者可見
     */
    private void isCanLoadData() {
        if (!isInit) {
            return;
        }

        if (getUserVisibleHint()) {
            lazyLoad();
            isLoad = true;
        } else {
            if (isLoad) {
                stopLoad();
            }
        }
    }

    /**
     * 檢視銷燬的時候講Fragment是否初始化的狀態變為false
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isInit = false;
        isLoad = false;

    }

    protected void showToast(String message) {
        if (!TextUtils.isEmpty(message)) {
            Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
        }

    }

    /**
     * 設定Fragment要顯示的佈局
     *
     * @return 佈局的layoutId
     */
    protected abstract int setContentView();

    /**
     * 獲取設定的佈局
     *
     * @return
     */
    protected View getContentView() {
        return view;
    }

    /**
     * 找出對應的控制元件
     *
     * @param id
     * @param <T>
     * @return
     */
    protected <T extends View> T findViewById(int id) {

        return (T) getContentView().findViewById(id);
    }

    /**
     * 當檢視初始化並且對使用者可見的時候去真正的載入資料
     */
    protected abstract void lazyLoad();

    /**
     * 當檢視已經對使用者不可見並且載入過資料,如果需要在切換到其他頁面時停止載入資料,可以覆寫此方法
     */
    protected void stopLoad() {
    }
}

在fragment中:

public class FeedImageFragment extends LazyLoadFragment {

    @Override
    protected int setContentView() {
        proxy = App.getProxy(getActivity());
        String feedDetailJson = getArguments().getString(ARG_SECTION_NUMBER);
        feedItem = Util.parseObject(feedDetailJson, FeedItem.class);
        return R.layout.fragment_feed_image;
    }
   //初始化當前頁面想執行的
    @Override
    protected void lazyLoad() {
        initView();
    }
   //實現當前介面不想看到的
    @Override
    protected void stopLoad() {
            imgDetailVideo.stopPlayback();
            imgDetailVideo.destroyDrawingCache();
    }

}

結果:

完美解決!