我目前正在创建一个音乐播放器应用程序。我的音乐库活动ViewPager
有四个页面/片段(对应于专辑、艺术家、所有歌曲和播放列表)。其中三个片段是just GridView
,最后一个是a ListView
(所有歌曲片段)。当应用程序第一次启动时,一切都运行得非常顺利。但是,当用户(第一次)选择要播放的歌曲时,LinearLayout
会在屏幕底部动态创建一个(称为“正在播放栏”),其中包含有关当前播放歌曲的信息。在这一点上,我所有的GridView
's 和 myListView
在滚动时都开始严重滞后。奇怪的是,我ViewPager
似乎没有在之间切换时遇到任何滞后Fragment
's 和以前一样无缝。当用户退出播放器然后恢复播放器时,此问题仍然存在(在这种情况下,“正在播放栏”已经可见)。
在这一切中还有另一个相当令人困惑的因素。当用户从库中选择专辑、艺术家或播放列表时,这将创建一个新活动,该活动仅ListView
包含来自所述艺术家/专辑/播放列表的所有歌曲。“正在播放栏”也添加到此活动中,但不会导致任何减速。这使我得出结论,该问题与我的图书馆活动中的ViewPager
and/or相关。Fragment
我完全被这个难住了,非常感谢任何帮助。
这是我的图书馆活动的 XML 布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@id/library_view"
>
<include layout="@layout/sd_error"/>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
/>
<include layout="@layout/now_playing_bar"/>
这是用于创建“正在播放栏”的代码:
public static void updateNowPlaying(Activity a)
{
View nowPlayingView = a.findViewById(R.id.now_playing_bar);
if (nowPlayingView == null)
return;
try
{
if (true && MusicUtils.sService != null && MusicUtils.sService.getAudioId() != -1)
{
ImageView cover = (ImageView) nowPlayingView.findViewById(R.id.cover);
TextView title = (TextView) nowPlayingView.findViewById(R.id.title);
TextView artist = (TextView) nowPlayingView.findViewById(R.id.artist);
title.setText(MusicUtils.sService.getTrackName());
String artistName = MusicUtils.sService.getArtistName();
if (MediaStore.UNKNOWN_STRING.equals(artistName))
artistName = a.getString(R.string.unknown_artist_name);
artist.setText(artistName);
cover.setImageURI(ContentUris.withAppendedId(
sArtworkUri, sService.getAlbumId()));
if (cover.getDrawable() == null)
cover.setImageResource(R.drawable.no_album_cover);
nowPlayingView.setVisibility(View.VISIBLE);
nowPlayingView.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Context c = v.getContext();
c.startActivity(new Intent(c, PlayerActivity.class));
}
});
return;
}
}
catch (RemoteException ex) {}
nowPlayingView.setVisibility(View.GONE);
}