我正在尝试为RecyclerView(线性垂直布局)中的视频项目实现自动播放功能。我不知道如何知道当前何时在屏幕上打开/关闭某个项目,因此我可以自动播放/暂停视频。如果将代码放在onBindViewHolder方法中,则所有视频将同时开始播放。也无法通过谷歌搜索找到解决方案。请帮助!
答案 0 :(得分:0)
对于Recyclerview,您应依靠布局管理器为您提供此信息。
https://developer.android.com/reference/android/support/v7/widget/GridLayoutManager 要么 https://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager
分配适配器时,将布局分配给RecyclerView。然后使用它来查看可见的内容。
让我通过一些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();