当前位置: 首页 > 知识库问答 >
问题:

用许多项目填充ScrollView需要太长时间

谢海阳
2023-03-14

我目前正在android手机上开发一款简单的mp3播放器作为应用程序。我正在查看sd卡和内部存储器上的所有文件,找到所有扩展名为“.mp3”的文件。

简单又好用。

然后我填写一个列表,列出所有产生的歌曲名称,点击后,它们开始播放。工作也很好,但是

我现在在我的个人手机上尝试了这一点,上面有700首歌曲,列表在不到一秒钟的时间内完成,但现在列表将用结果填充foreach循环中的ScrollView。这需要永远:

 private void PopulateScrollView(List<string> content)
        {
            LinearLayout root = (LinearLayout)FindViewById(Resource.Id.scrollview);
            mp3 = new List<MP3object>();

            foreach (string obj in content)
            {
                WriteMetaDataToFileList(obj);

                TextView txt = new TextView(this);
                reader.SetDataSource(obj);
                txt.Text = reader.ExtractMetadata(MediaMetadataRetriever.MetadataKeyTitle);
                txt.TextSize = 20;
                txt.Gravity = Android.Views.GravityFlags.Center;

                root.AddView(txt);

                txt.Click += delegate
                {
                    PlayMusic(Android.Net.Uri.Parse(obj));
                    firstStart = false;
                    txt_CurrentSong.Text = CurrentActiveSongUri.ToString();
                    btn_StartOrPause.Text = Resources.GetString(Resource.String.Pause);
                };
            }
        }

所以,我很好奇。与手机上的“普通”音乐播放器相比,我有什么不同之处?我打开它,所有的歌曲都在滚动视图中填满了,几乎没有等待的时间。显然,通过700次循环来填满歌曲是太多的工作了,但它必须完成,对吗?我看到什么了吗?一些帮助会很棒的!:)

谢谢你。

***编辑:

此外,我还注意到,每个在手机上列出我的文件的应用程序都能在滚动视图中快速列出甚至1000个文件。显然,我用手机中的静态项目填充滚动视图的方式是不正确的。还有其他方法吗?谢谢:)

共有1个答案

傅浩漫
2023-03-14

您遇到的问题是,ScrollView不能用于长数据列表。你迫使Android生成、布局和维护大量视图。相反,你应该查看RecyclerView。

RecyclerView用于处理长长的数据元素列表,比如mp3文件的用例。它只通过创建显示屏幕上当前项目所需的元素(加上几个附加项目以帮助平滑滚动)来处理大量数据。这大大降低了系统的内存和cpu压力,并允许您在其他应用程序中看到响应。其他应用程序很可能使用RecyclerView或类似模式。

我建议大家阅读谷歌关于RecyclerView的指南(上面有链接,但这里也是为了方便),了解如何使用它。我还建议使用RecyclerView的内置列表项选择功能来处理用户点击,而不是文本视图。单击事件。两者都可以工作,但选择功能可能会更方便,因为RecyclerView为您处理硬部件。

 类似资料:
  • 问题内容: 我正在使用PHP开发电子邮件验证正则表达式,我需要知道TLD可能有效且仍然有效的时间。我进行了一些搜索,但找不到关于该主题的太多信息。那么一个TLD可能会持续多久? 问题答案: DNS允许单个标签最多包含63个字符。

  • 我正在尝试从一个驱动器恢复我的Android Studio项目文件。它花了这么长时间,文件是如此巨大,我很担心为什么会这样。我用过eclipse,swift,它没有这么复杂。 有什么想法,哪些文件是最重要的,我可以下载并继续工作?发生这种情况是因为我的开发笔记本电脑在一个项目的中间出现了一个错误,所以我跳到另一台计算机上从OneDrive同步并继续我的项目开发。我通常会在Eclipse上这样做,这

  • 问题内容: 我要问的是已被要求在一个问题很抽象的术语,用(理解)没有具体的答案提供: 在MySQL提示下,如何创建和填充具有1列和1111行的表,其中该列包含2222和5555之间的随机数? 就像是: 已经提出了这个问题,但是要么依赖于外部语言进行循环,要么太笼统了。我想知道是否可以从典型的Linux MySQL提示符下执行此简单操作。 问题答案: 要创建表,请使用: 然后,用随机值填充它,您可以

  • 如果可能的话,我如何用更少的代码将下面所示代码的结尾部分移到另一行或修改文本,以实现所需的结果。我键入了以下代码: 我试图实现的是显示以下数据:-仅显示,仅显示Dakota Spitfire和Hurricane或Dakota和Spitfire或Dakota和两个Spitfire,如果它们显示在数据表明细表中,则完整代码如下。需要编辑的是从Southport=开始的行: 当我运行代码时,我得到以下回

  • 问题内容: 嗨,我非常需要一些帮助,我已经在jbutton启用之前搜索了有关要填充的Jtextfield的文档,大多数人都使用DocumentListener来确定是否填充了Jtextfield。我尝试了DocumentListener,它可以工作,但是我想要的是所有Jtextfield都不能为空,然后Jbutton启用,这是我的代码。 问题答案: 表示所有字段必须为空。有时您需要大声朗读此逻辑…