我目前正在使用一个简单的mp3播放器作为Android手机上的应用程序。我正在浏览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);
};
}
}
所以,我很奇怪。与手机上的“常规”音乐播放器相比,我的操作有所不同吗?我打开它,所有歌曲都已经在ScrollView中填满了,几乎没有等待时间。显然,经过700次以上的循环以使歌曲充满歌曲是太多的工作,但是必须完成,对吗?还是我在这里看到问题?一些帮助将是令人敬畏的! :)
谢谢。
***编辑:
我还注意到,每个在手机上列出我的文件的应用程序都很快,就像在地狱视图中甚至列出了1000多个文件一样。显然,我的方法是用手机中的静态项目填充滚动视图的不正确方法。还有其他方法吗?谢谢:)
答案 0 :(得分:0)
您遇到的问题是ScrollView不能用于较长的数据列表。您正在强迫Android生成,布置和维护巨大数量的视图。相反,您应该查看RecyclerView。
RecyclerView用于处理长长的数据元素列表,例如mp3文件的用例。它仅通过创建显示屏幕上当前项目所需的元素来处理大量数据(外加几个其他项目以帮助平滑滚动)。这大大减少了系统上的内存和CPU压力,并允许您在其他应用程序中看到响应。这些其他应用程序很可能使用RecyclerView或类似模式。
我建议您仔细阅读Google在RecyclerView上的指南(上面链接为方便起见,也链接here)以了解如何使用它。我还建议您使用RecyclerView的内置列表项选择功能来处理用户点击,而不是处理TextView.click事件。两者都可以使用,但是选择功能可能会更方便,因为RecyclerView可以为您处理坚硬的零件。