效果如上图
第一步:添加依赖,集成别人的
compile 'fm.jiecao:jiecaovideoplayer:4.8.3'
第二步:构建列表,写适配器
public class TrainRecommendFragment extends BaseFragment { private ListView listView; private ProgressBar bar; private View mMainToolbar; private float mStartY = 0, mLastY = 0, mLastDeltaY; private TrainRecommend trainRecommend;//获取到的数据类 private TrainRecommendAdapter adapter; private VdieoBean videopBean; private VideoAdapter adapters; private View no_msg;//暂无数据界面 private View error_msg;//加载失败 private TextView init_tv;//重新加载 private boolean isS = false;//是否已经成功加载数据 @Override public int getLayoutId() { return R.layout.fragment_train_recommend; } @Override public void initViews() { listView = findView(R.id.list); bar = findView(R.id.bar); no_msg = findView(R.id.no_msg); error_msg = findView(R.id.error_msg); init_tv = findView(R.id.init_tv); View header = LayoutInflater.from(getActivity()) .inflate(R.layout.title_head, null);//这个header高度要与toolbar相同 listView.addHeaderView(header); // 向上滑动隐藏,向下展示 TrainingCampActivity activity = (TrainingCampActivity) getActivity(); mMainToolbar = activity.getView(); listView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { final float y = event.getY(); float translationY = mMainToolbar.getTranslationY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mStartY = y; mLastY = mStartY; break; case MotionEvent.ACTION_MOVE: float mDeltaY = y - mLastY; float newTansY = translationY + mDeltaY; if (newTansY <= 0 && newTansY >= -mMainToolbar.getHeight()) { mMainToolbar.setTranslationY(newTansY); } mLastY = y; mLastDeltaY = mDeltaY; break; case MotionEvent.ACTION_UP: ObjectAnimator animator = null; Log.d("--main--", "mLastDeltaY=" + mLastDeltaY); if (mLastDeltaY < 0 && listView.getFirstVisiblePosition() > 0) { Log.v("--main--", "listView.first=" + listView.getFirstVisiblePosition()); animator = ObjectAnimator.ofFloat(mMainToolbar, "translationY", mMainToolbar.getTranslationY(), -mMainToolbar.getHeight()); } else { animator = ObjectAnimator.ofFloat(mMainToolbar, "translationY", mMainToolbar.getTranslationY(), 0); } animator.setDuration(100); animator.start(); animator.setInterpolator(AnimationUtils.loadInterpolator(getActivity(), android.R.interpolator.linear)); break; } return false; } }); //请求数据 initData(); initListeners(); } @Override public void initListener() { setOnClick(init_tv); } @Override public void initData() { //网络请求的数据,自己用自己的方法写 List<TrainRecommend.DataBean.ListBean> list = trainRecommend.getData().getList(); String vids = null;//获取视频播放的url
vids = list.get(i).getTidbitsVid();}public interface GetView { View getView(); } /** * 滑动监听 */ private void initListeners() { onScrollListener = new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case AbsListView.OnScrollListener.SCROLL_STATE_FLING: break; case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: //滑动停止自动播放视频 autoPlayVideo(view); break; case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: break; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisible == firstVisibleItem) { return; } firstVisible = firstVisibleItem; visibleCount = visibleItemCount; } }; listView.setOnScrollListener(onScrollListener); } /** * 滑动停止自动播放视频 */ private AbsListView.OnScrollListener onScrollListener; private int firstVisible;//当前第一个可见的item private int visibleCount;//当前可见的item个数 private JCVideoPlayerStandard currPlayer; private void autoPlayVideo(AbsListView view) { for (int i = 0; i < visibleCount; i++) { if (view != null && view.getChildAt(i) != null && view.getChildAt(i).findViewById(R.id.player_list_video) != null) { currPlayer = (JCVideoPlayerStandard) view.getChildAt(i).findViewById(R.id.player_list_video); Rect rect = new Rect(); //获取当前view 的 位置 currPlayer.getLocalVisibleRect(rect); int videoheight = currPlayer.getHeight(); if (rect.top == 0 && rect.bottom == videoheight) { if (currPlayer.currentState == JCVideoPlayer.CURRENT_STATE_NORMAL || currPlayer.currentState == JCVideoPlayer.CURRENT_STATE_ERROR) { currPlayer.startButton.performClick(); } return; } } } //释放其他视频资源 JCVideoPlayer.releaseAllVideos(); } @Override public void onPause() { super.onPause(); JCVideoPlayer.releaseAllVideos(); } }第三步:fragment的布局文件<ListView
android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="10dp"