Android 带有ListView和TextureView的全屏视频源;“眨眼”;数据集更改时

Android 带有ListView和TextureView的全屏视频源;“眨眼”;数据集更改时,android,listview,video,notifydatasetchanged,textureview,Android,Listview,Video,Notifydatasetchanged,Textureview,我正在尝试在Android上创建一个全屏视频源 我决定使用列表视图,每个项目都是纹理视图。因为它是全屏的,所以在给定的时刻,我们总是显示一个且只有一个项目。 当TextureView可用时,我创建一个MediaPlayer并在表面上播放视频。它工作得很好 当我到达列表的底部时,我会从服务器加载更多数据。加载新数据时,我调用我的BaseAdapter的notifyDataSetChanged(),并为每个可见项重新创建视图 问题在于它会使当前视频“闪烁”(重新创建视图时,视频会消失,然后重新出现)

我正在尝试在Android上创建一个全屏视频源

我决定使用
列表视图
,每个项目都是
纹理视图
。因为它是全屏的,所以在给定的时刻,我们总是显示一个且只有一个项目。
TextureView
可用时,我创建一个
MediaPlayer
并在表面上播放视频。它工作得很好

当我到达列表的底部时,我会从服务器加载更多数据。加载新数据时,我调用我的
BaseAdapter
notifyDataSetChanged()
,并为每个可见项重新创建视图

问题在于它会使当前视频“闪烁”(重新创建视图时,视频会消失,然后重新出现)。

我真的不知道如何解决这个问题:
ListView
总是在数据集更改时重新创建项目视图。 我觉得在这里使用
ListView
是正确的解决方案,因为我显示了一个视频项目列表,但可能我走错了方向

  • 如何停止这种闪烁?(有没有办法告诉
    列表视图
    不要重新创建当前项目的视图?)
  • 我是否应该使用
    列表视图以外的其他内容?如果是,我应该看什么
谢谢。

您应该使用。在您的情况下,将当前显示的视频的id添加到支架中,这将允许您在convertView已经显示视频的情况下,不更改其返回

下面是一个(未经测试的)代码示例,展示了这个想法:

public View getView (int position, View convertView, ViewGroup parent) {
    Holder holder;
    if(convertView != null) {
         holder = (Holder) convertView.getTag();
         if(holder.displayedContent == getContentToDisplay(position)) {
             // the view we were asked to convert is already displaying 
             // the good video, no need to change anything to it !
             return convertView; 
         } else {
             // convert the view by displaying the new video
         }
    } else {
        // create a new view !
    }
}

private static class Holder {
    int displayedContent;
    // + references to the views
}

视频播放是停止并重新启动,还是在“闪烁”期间没有出现在屏幕上?谢谢您的时间。视频停止然后重新启动。太棒了!我推迟了这个模式的使用,因为它迫使我处理很多内部状态(视频等),但我不应该这样做!它就像一个符咒!