現在、音楽プレーヤーアプリケーションを作成しています。私の音楽ライブラリ アクティビティは、ViewPager
4 つのページ/フラグメント (アルバム、アーティスト、すべての曲、プレイリストに対応) です。フラグメントのうちの 3 つは だけGridView
で、最後の 1 つはListView
(すべての曲のフラグメント) です。アプリケーションを最初に起動すると、すべてが完全にスムーズに実行されます。ただし、ユーザーが (初めて) 再生する曲を選択するLinearLayout
と、現在再生中の曲に関する情報を含む (「再生中バー」と呼ばれる) が画面の下部に動的に作成されます。この時点で、すべてGridView
の と myListView
がスクロール時にかなり遅くなり始めます。奇妙なことに、ViewPager
切り替え時に遅延が発生していないようです。Fragment
は以前と同じようにシームレスです。この問題は、ユーザーがプレーヤーを終了して再開した場合にも発生します (この場合、「現在再生中のバー」は既に表示されています)。
このすべてには、もう 1 つのかなり紛らわしい要因もあります。ユーザーがライブラリからアルバム、アーティスト、またはプレイリストを選択すると、その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);
}