タブレット用の音楽プレーヤーアプリを書いています
活動は 3 つのセクションとして考えることができます
画面の左側には、フォルダー間を移動するために使用されるリストビュー オブジェクトがあります。
画面の中央には、現在選択されているフォルダー内で見つかった曲のリストを含むリストビュー オブジェクトがあります。
画面の右側には再生コントロールが含まれています。
ユーザーがフォルダーに移動すると、中央の列に表示されるファイルのリストを再生できます。これは 95% 完璧に機能しています。
曲が完了すると、中央のリストビューの次の項目に移動し、これをリストまでスクロールして一番上に配置します。
これは何時間も完全に機能し、リストの一番上の項目は現在再生中の曲です。
ただし、中央のリストが再生中の曲と完全に同期していない場合があり、ほとんど再入力されたようになります。これは、アプリケーションがバックグラウンドで実行されている場合に発生する傾向があります。ただし、これは非常にまれであるため、原因が何であるかを突き止めることができませんでした.
曲リストを作成するコードは、フォルダー リストがトリガーされた後に呼び出されます。これにより、中央の列に値が入力され、曲のリストがメモリに保存されます。音楽プレーヤーはメモリから再生します。ただし、曲のリストが再作成された場合、メモリ内のリストは破棄され、確実に同期が維持されます。
誰か提案はありますか?まったく何か?アプリがフォーカスに戻ると、アクティビティが作成/再作成されることに関係していると確信していますが、なぜこれが毎回発生しないのですか?
編集: oncompletion リスナーでリストビューをスクロールするコードがあります。アプリが画面上でフォーカスされていない場合、曲は完了後に次の曲に移動しますが、リスト ビューはスクロールできますか? そうでない場合、なぜこの問題が断続的になるのですか?
アクティビティが作成されたら、次のようにします。
mp.setOnCompletionListener(これ);
これは、以下のコードに関連しています。
public void onCompletion(MediaPlayer mp) {
// check for repeat is ON or OFF
if(isRepeat){
// repeat is on play same song again
playSong(currentSongIndex);
}
else{
// no repeat or shuffle ON - play next song
if(currentSongIndex < (songsList.size() - 1)){
playSong(currentSongIndex + 1);
currentSongIndex = currentSongIndex + 1;
//filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
if (android.os.Build.VERSION.SDK_INT >= 11)
{
filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
}
else if (android.os.Build.VERSION.SDK_INT >= 8)
{
int firstVisible = filelv.getFirstVisiblePosition();
int lastVisible = filelv.getLastVisiblePosition();
if (currentSongIndex < firstVisible)
filelv.smoothScrollToPosition(currentSongIndex);
else
filelv.smoothScrollToPosition(currentSongIndex + lastVisible - firstVisible - 2);
}
else
{
filelv.setSelectionFromTop(currentSongIndex, 0);
}
}else{
// play first song
playSong(0);
currentSongIndex = 0;
filelv = (ListView)getActivity().findViewById(R.id.FileList);
//filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
if (android.os.Build.VERSION.SDK_INT >= 11)
{
filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
}
else if (android.os.Build.VERSION.SDK_INT >= 8)
{
int firstVisible = filelv.getFirstVisiblePosition();
int lastVisible = filelv.getLastVisiblePosition();
if (currentSongIndex < firstVisible)
filelv.smoothScrollToPosition(currentSongIndex);
else
filelv.smoothScrollToPosition(currentSongIndex + lastVisible - firstVisible - 2);
}
else
{
filelv.setSelectionFromTop(currentSongIndex, 0);
}
}
}
}
発生するもう 1 つのことは、アプリがまだサービスとして実行するように構成されていないことです。これが原因でしょうか?