Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Listview不同步_Android_Listview_Synchronization - Fatal编程技术网

Android Listview不同步

Android Listview不同步,android,listview,synchronization,Android,Listview,Synchronization,我正在为平板电脑编写一个音乐播放器应用程序 该活动可分为三个部分 屏幕左侧有一个listview对象,用于在文件夹中导航 屏幕中央有一个listview对象,其中包含在当前选定文件夹中找到的歌曲列表 屏幕右侧包含播放控件 当用户导航到某个文件夹时,他们可以播放显示在中间列中的文件列表。这是工作95%完美 当一首歌曲完成时,它会移动到中心listview中的下一个项目,并将其滚动到列表以将其置于顶部 这可以完美地工作数小时,列表中的第一项是当前播放的歌曲 然而,有时中间的列表与正在播放的歌曲完全不

我正在为平板电脑编写一个音乐播放器应用程序

该活动可分为三个部分

屏幕左侧有一个listview对象,用于在文件夹中导航

屏幕中央有一个listview对象,其中包含在当前选定文件夹中找到的歌曲列表

屏幕右侧包含播放控件

当用户导航到某个文件夹时,他们可以播放显示在中间列中的文件列表。这是工作95%完美

当一首歌曲完成时,它会移动到中心listview中的下一个项目,并将其滚动到列表以将其置于顶部

这可以完美地工作数小时,列表中的第一项是当前播放的歌曲

然而,有时中间的列表与正在播放的歌曲完全不同步,几乎就像重新填充一样。当应用程序一直在后台运行时,这种情况就会发生。然而,这是如此罕见,以至于我一直无法找到原因可能是什么

触发文件夹列表后,将调用创建歌曲列表的代码。这将填充中间列,并将歌曲列表存储在内存中。音乐播放器根据记忆播放。然而,如果歌曲列表被重新创建,那么内存中的列表将被销毁,并且它们肯定仍然是同步的

有人有什么建议吗?有什么事吗?我确信这与在应用程序重新进入焦点时创建/重新创建的活动有关,但为什么不是每次都会发生这种情况呢

编辑:在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);
                        } 
                    }
                }
            }
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中是否有任何奇怪的日志
其次 然后试着检查代码,寻找任何可疑的东西

  • 列表的创建是如何完成的
  • 你有其他线程在运行吗
  • 有人提到中间的名单吗
  • 在任何地方都有悬挂的
    上下文对象吗
最后 如果你没有办法重现一个错误,那么修复它是非常困难的,所以要想办法强迫它。比如:让应用程序在后台运行,打开许多其他应用程序,然后再次回到音乐播放器。这是可以做到的