android - 更改数据集时使用 ListView 和 TextureView "blinks"的全屏视频源

标签 android listview video notifydatasetchanged textureview

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

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

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

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

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

  • 如何停止这种闪烁? (有没有办法告诉 ListView 不要重新创建当前项目的 View ?)
  • 我应该使用 ListView 以外的东西吗?如果是,我应该看什么?

谢谢。

最佳答案

你应该使用 View Holder pattern .在您的情况下,将当前显示的视频的 id 添加到 holder,如果它已经在显示视频,这将允许您返回不变的 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
}

关于android - 更改数据集时使用 ListView 和 TextureView "blinks"的全屏视频源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27910297/

相关文章:

java - 我应该如何阻止数字字符串在显示时四舍五入?

android - 视频背景自动播放无法在移动设备 (Wordpress) 上运行

android - 如何在 my/sdcard/Android/data/mypackage/files 文件夹中获取视频的缩略图?

android - Android MediaMuxer音频问题

java - 仅从特定 Activity 扫描 NFC

wpf - 通过拖动启用 ListView 多选

Android——使用自定义 ArrayAdapter 在多行 ListView 中添加和删除项目

android - 如何在按钮上显示内容列表?

javascript - 如何为每个 createTableViewRow 添加标签并将所有内容居中?

android - 从 Android 崩溃应用程序上传大视频到 PHP 服务器