Android Listview不同步
我正在为平板电脑编写一个音乐播放器应用程序 该活动可分为三个部分 屏幕左侧有一个listview对象,用于在文件夹中导航 屏幕中央有一个listview对象,其中包含在当前选定文件夹中找到的歌曲列表 屏幕右侧包含播放控件 当用户导航到某个文件夹时,他们可以播放显示在中间列中的文件列表。这是工作95%完美 当一首歌曲完成时,它会移动到中心listview中的下一个项目,并将其滚动到列表以将其置于顶部 这可以完美地工作数小时,列表中的第一项是当前播放的歌曲 然而,有时中间的列表与正在播放的歌曲完全不同步,几乎就像重新填充一样。当应用程序一直在后台运行时,这种情况就会发生。然而,这是如此罕见,以至于我一直无法找到原因可能是什么 触发文件夹列表后,将调用创建歌曲列表的代码。这将填充中间列,并将歌曲列表存储在内存中。音乐播放器根据记忆播放。然而,如果歌曲列表被重新创建,那么内存中的列表将被销毁,并且它们肯定仍然是同步的 有人有什么建议吗?有什么事吗?我确信这与在应用程序重新进入焦点时创建/重新创建的活动有关,但为什么不是每次都会发生这种情况呢 编辑:在oncompletion侦听器中有滚动列表视图的代码。虽然如果应用程序未在屏幕上聚焦,歌曲会在完成后移动到下一首歌曲,但列表视图是否能够滚动?如果不是,为什么这个问题是间歇性的 创建活动时,我会执行以下操作: mp.setOnCompletionListener(此) 这与以下代码有关:Android Listview不同步,android,listview,synchronization,Android,Listview,Synchronization,我正在为平板电脑编写一个音乐播放器应用程序 该活动可分为三个部分 屏幕左侧有一个listview对象,用于在文件夹中导航 屏幕中央有一个listview对象,其中包含在当前选定文件夹中找到的歌曲列表 屏幕右侧包含播放控件 当用户导航到某个文件夹时,他们可以播放显示在中间列中的文件列表。这是工作95%完美 当一首歌曲完成时,它会移动到中心listview中的下一个项目,并将其滚动到列表以将其置于顶部 这可以完美地工作数小时,列表中的第一项是当前播放的歌曲 然而,有时中间的列表与正在播放的歌曲完全不
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);
}
}
}
}
public void onCompletion(MediaPlayer mp){
//检查“重复”是否打开或关闭
如果(isRepeat){
//重复播放同一首歌
播放歌曲(当前歌曲索引);
}
否则{
//没有重复或洗牌播放下一首歌曲
如果(当前歌曲索引<(歌曲列表大小()-1)){
播放歌曲(当前歌曲索引+1);
currentSongIndex=currentSongIndex+1;
//filelv.smoothScrollToPositionFromTop(currentSongIndex,0);
如果(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();
如果(currentSongIndex=11)
{
filelv.smoothScrollToPositionFromTop(currentSongIndex,0);
}
else if(android.os.Build.VERSION.SDK_INT>=8)
{
int firstVisible=filelv.getFirstVisiblePosition();
int lastVisible=filelv.getLastVisiblePosition();
如果(currentSongIndex
发生的另一件事是,我的应用程序尚未配置为作为服务运行。这可能是原因吗?此错误听起来像是上下文错误或线程问题。如果应用程序在后台,而android在不再需要的时候杀死了你的一个进程,你可能会有非常奇怪的行为。由于其他应用程序的时间和内存,这也是间歇性的 弗斯特
- 发生这种情况时,log cat中是否有任何奇怪的日志
- 列表的创建是如何完成的
- 你有其他线程在运行吗
- 有人提到中间的名单吗
- 在任何地方都有悬挂的
上下文对象吗