像facebook一样在listview / scrollview中自动播放视频

时间:2016-02-24 12:44:59

标签: android scrollview android-videoview

如果视图包含视频,我需要在列表视图/滚动视图中自动播放视频。这与Facebook非常相似。如果用户向下/向上滚动并且可见区域包含系统将播放视频的视频,并且如果仍然滚动则会自动停止该视频。它应该像, 假设从顶部开始的第一个可见项目可见性是< 50%然后第一个可见的项目应该发挥其他明智的第二个可见项应该发挥。 谢谢!

我正在使用以下代码:

private ListView listView = null;

View getArticleListView()
{
    listView = new ListView(context);

    listView.setAdapter(new ListAdaptor(context, titleList, descriptionList, pubDateList, thumbnailList, contentList, pageNumber));

    listView.setRecyclerListener(new AbsListView.RecyclerListener() {
        @Override
        public void onMovedToScrapHeap(View view) {
            View firstView = listView.getChildAt(0);

            if (ListAdaptor.videoPlayer != null)
                ListAdaptor.videoPlayer.stopPlayback();
        }
    });

    listView.setOnScrollListener(new AbsListView.OnScrollListener() {
        private int mFirstVisibleRow = 0;
        private int mActiveItem = 0;

        @Override
        public void onScrollStateChanged(AbsListView absListView, int i) {


                int firstVisibleRow = listView.getFirstVisiblePosition();
                if( mFirstVisibleRow != firstVisibleRow )
                {
                    mFirstVisibleRow = firstVisibleRow;


                    VideoView prevActiveVideoView = getVideoViewForRow(mActiveItem); // Cancel the video of the previous active item
                    if( prevActiveVideoView != null )
                    {
                        prevActiveVideoView.setVisibility(View.INVISIBLE);
                        ListAdaptor.imgCardLitImage.setVisibility(View.VISIBLE);
                        ListAdaptor.imageVideoOverLay.setVisibility(View.VISIBLE);
                        prevActiveVideoView.pause();
                    }

                    // Start the video of the new active item
                    if(viewHeight > (listView.getChildAt(0).getHeight())/2 ){
                        mActiveItem = mFirstVisibleRow + 1;
                    }
                    else {
                        mActiveItem = mFirstVisibleRow;
                    }

                    final VideoView newActiveVideoView = getVideoViewForRow(mActiveItem);
                    if(newActiveVideoView != null)
                    {

                        newActiveVideoView.setVisibility(View.VISIBLE);

                        newActiveVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                            @Override
                            public void onPrepared(MediaPlayer mediaPlayer) {
                                mediaPlayer.start();
                                        mediaPlayer.setVolume(0, 0);
                            }
                        });
                    }

                }

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                             int visibleItemCount, int totalItemCount) {
            View v = listView.getChildAt(0);
            int top = (v == null) ? 0 : (listView.getPaddingTop() - v.getTop());
            viewHeight = top;

        }

        private VideoView getVideoViewForRow(int row)
        {
            int firstVisibleRow = listView.getFirstVisiblePosition();
            View rowView = listView.getChildAt(row-firstVisibleRow);
            return (rowView == null) ? null : (VideoView)rowView.findViewById(R.id.videoView);
        }


    });

    return listView;
}

在视图中的ListAdaptor类中我只是使用

    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        .
        .
        .

        Uri uri = Uri.parse(contentList.get(position));
        videoPlayer.setVideoURI(uri);

        return view;
        }

0 个答案:

没有答案