检测当前在RecyclerView中滚动到哪个项目

时间:2018-10-02 12:58:47

标签: android android-recyclerview

我正在尝试为RecyclerView(线性垂直布局)中的视频项目实现自动播放功能。我不知道如何知道当前何时在屏幕上打开/关闭某个项目,因此我可以自动播放/暂停视频。如果将代码放在onBindViewHolder方法中,则所有视频将同时开始播放。也无法通过谷歌搜索找到解决方案。请帮助!

2 个答案:

答案 0 :(得分:0)

对于Recyclerview,您应依靠布局管理器为您提供此信息。

https://developer.android.com/reference/android/support/v7/widget/GridLayoutManager 要么 https://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager

分配适配器时,将布局分配给RecyclerView。然后使用它来查看可见的内容。

enter image description here

让我通过一些Psedo Kotlin代码为您提供更多帮助,以帮助您解决播放器方面的问题。

假设您有一些绑定到每一行的对象,这些对象可以触发播放并具有唯一的ID。在本示例中,我们将其称为ActiveRowPlayer。

注意* 如果您使用的是数据绑定,将视频播放器的播放内容绑定到填充行的模型中的属性很简单,但这对于不同的帖子来说是不同的。

您可以创建如下界面:

interface IActivePlayerUpdater{
    fun onUpdateCurrentPlayer
}

您可以创建一个辅助方法,例如:

在您的活动中,您可以实现:IActivePlayerUpdater之类的接口并覆盖其方法。

override fun onUpdateCurrentPlayer(){
    var activeRowPlayer = recyclerView.layoutManager.findFirstCompletelyVisibleItemPosition()
    if(activeRowplayer.someID != currentRowPlayer.someID){
        currentRowPlayer.stopPlaying
        currentRowPlayer = activeRowPlayer
        activeRowPlayer.startPlaying
    }
}

然后将其传递到适配器中,仅监视onBind方法,并在每次调用新的onBind时都进行监视,这意味着内容已移动到足以触发新行项目的位置。

MyAdapterConstructor(IActivePlayerUpdater myCallback)

fun recyclerView.onBindMethod(stuffThatComesHere){
    //do normal stuff
    myCallback.onUpdateCurrentPlayer()
}

请记住,这只是伪造的,可帮助您旅途中。不打算直接复制和粘贴。

----注意*要求注释,以便从适配器外部提供如何触摸视图模型---

  

@Goran,此示例是我很久以前设置的,以避免   选择时notifyDataSetChanged更改为切换复选框   每一个项目。我最终选择了一个更好的选择,但您问如何   您得到了viewmodel,这是一个示例。 rvCameraRoll是我的   recyclerView,我用它来显示相机媒体,但这不是   相关,只专注于获取viewModel部分。

您唯一需要关心的部分就是获取ViewHolder,我只是将其余部分留在这里,以防它对您有所帮助。

     int count = rvCameraRoll.getChildCount();
    for (int i = 0; i < count; i++) {
        MediaModelGridAdapter.ViewHolder childRow = (MediaModelGridAdapter.ViewHolder)rvCameraRoll.getChildViewHolder(rvCameraRoll.getChildAt(i));
        if(isVisible) {
            childRow.imgCellSelected.setVisibility(View.VISIBLE);
            if(getMediaModelList().get(i).getIsSelected()){
                childRow.imgCellSelected.setBackgroundResource(R.drawable.ic_ap_selected_on);
            }

        }else{
            //check that exists, because after fresh delete list may be short while updating cells
            if(getMediaModelList().size() > i) {
                getMediaModelList().get(i).setIsSelected(false);
            }
            childRow.imgCellSelected.setBackgroundResource(R.drawable.ic_ap_selected_off);
            childRow.imgCellSelected.setVisibility(View.GONE);

        }

    }

OLD

将其留给使用ListView的任何人

有一个用于ListView的OnScrollListener

您可以覆盖

onScrollStateChanged(AbsListView view, int scrollState)

onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)

这将为您提供可见的ListView项。因此,通过使用onScroll,您可以检测到可见的项目并确定要播放和停止播放的项目。

如果与recyclerview一起使用 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnScrollListener

答案 1 :(得分:0)

RecyclerView仅保存项目,而LayoutManager负责显示项目,因此为了获得用户可见的项目,假设您使用LinearLayoutManager,则应调用: ((LinearLayoutManager)recyclerView.getLayoutManager())。findFirstVisibleItemPosition(); 要么 ((LinearLayoutManager)recyclerView.getLayoutManager())。findLastVisibleItemPosition();