Amna Mirza
Amna Mirza

Reputation: 703

How to play video of video-view that is currently focus in recycler view

In my app there is a recycler-view having video-views, I want to auto-play the specific video view which is completely in focus when scrolled.

Upvotes: 5

Views: 8800

Answers (2)

Omkar T
Omkar T

Reputation: 883

Answer inspired from https://stackoverflow.com/a/45281307/9752209

Callback to get center item position when scrolling stopped

import android.content.Context
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class RecyclerCenterItemFinder(
    private val context: Context,
    private val layoutManager: LinearLayoutManager,
    private val callback: (Int) -> Unit,
    private val controlState: Int = RecyclerView.SCROLL_STATE_IDLE
) :
    RecyclerView.OnScrollListener() {
    override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
        if (controlState == ALL_STATES || newState == controlState) {
            val firstVisible = layoutManager.findFirstVisibleItemPosition()
            val lastVisible = layoutManager.findLastVisibleItemPosition()
            val itemsCount = lastVisible - firstVisible + 1
            val screenCenter: Int = context.resources.displayMetrics.widthPixels / 2
            var minCenterOffset = Int.MAX_VALUE
            var middleItemIndex = 0
            for (index in 0 until itemsCount) {
                val listItem = layoutManager.getChildAt(index) ?: return
                val topOffset = listItem.top
                val bottomOffset = listItem.bottom
                val centerOffset =
                    Math.abs(topOffset - screenCenter) + Math.abs(bottomOffset - screenCenter)
                if (minCenterOffset > centerOffset) {
                    minCenterOffset = centerOffset
                    middleItemIndex = index + firstVisible
                }
            }
            callback(middleItemIndex)
        }
    }

    companion object {
        const val ALL_STATES = 10
    }
}

recycler.addOnScrollListener(RecyclerCenterItemFinder(requireContext(),
                recycler.layoutManager,
                { centerItemPosition ->
                    playVideoAtPosition(centerItemPosition)
                }
            ))

Upvotes: 0

Amna Mirza
Amna Mirza

Reputation: 703

RecyclerView rv_featureList;
private View currentFocusedLayout, oldFocusedLayout;

@Override
public void onCreate(Bundle instanceState) {
    rv_featuredList.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView,
                                         int newState) {
            super.onScrollStateChanged(recyclerView, newState);


            if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                //get the recyclerview position which is completely visible and first
                int positionView = ((LinearLayoutManager) rv_featuredList.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
                Log.i("VISISBLE", positionView + "");
                if (positionView >= 0) {
                    if (oldFocusedLayout != null) {
                        //Stop the previous video playback after new scroll
                        VideoView vv_dashboard = (VideoView) oldFocusedLayout.findViewById(R.id.vv_dashboard);
                        vv_dashboard.stopPlayback();
                    }


                    currentFocusedLayout = ((LinearLayoutManager) rv_featuredList.getLayoutManager()).findViewByPosition(positionView);
                    VideoView vv_dashboard = (VideoView) currentFocusedLayout.findViewById(R.id.vv_dashboard);
                    //to play video of selected recylerview, videosData is an array-list which is send to recyclerview adapter to fill the view. Here we getting that specific video which is displayed through recyclerview.
                    playVideo(videosData.get(positionView));
                    oldFocusedLayout = currentFocusedLayout;
                }
            }

        }

    });
}

Upvotes: 10

Related Questions