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();
    }

}

结果:

完美解决!

参考:https://blog.csdn.net/linglongxin24/article/details/53205878#commentBox

猜你喜欢

转载自blog.csdn.net/Android_hv/article/details/81120553