Android實現ViewPager滑動播放視訊,ViewPager+Fragment取消懶載入問題
阿新 • • 發佈:2019-02-08
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(); }
}
結果:
完美解決!