Android Listview不同步

时间:2012-08-25 14:13:49

标签: android listview synchronization

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

活动可以被认为是3个部分

屏幕左侧有一个listview对象,用于浏览文件夹

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

屏幕右侧包含播放控件。

当用户导航到文件夹时,他们可以播放中心列中显示的文件列表。这完美地工作了95%。

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

这可以完美地工作几个小时,列表中的顶部项目是当前播放的歌曲。

然而,有时候中心的列表与正在播放的歌曲完全不同步,几乎就像它已被重新填充一样。当应用程序在后台运行时,往往会发生这种情况。然而,这是非常罕见的,我无法追查原因可能是什么。

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

有人有什么建议吗?什么都没有?我确定它是在创建/重新创建活动的同时将应用程序移回焦点,但为什么每次都不会发生这种情况?

编辑:有一些代码可以在oncompletion监听器中滚动listview。如果应用程序没有在屏幕上聚焦,如果歌曲在完成后移动到下一首歌曲,列表视图是否能够滚动?如果没有,为什么这个问题会断断续续?

创建活动后,我这样做:

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 个答案:

答案 0 :(得分:1)

此错误听起来像是上下文错误或线程问题。如果应用程序在后台并且android在不再需要时杀死了你的一个进程,那么你可能最终会遇到非常奇怪的行为。由于其他应用程序的时间和内存,这也是间歇性的。

第一

  • 发生这种情况时,log cat中是否有任何奇怪的日志?

其次

然后尝试浏览代码并查找可疑的内容。

  • 列表的创作是如何完成的。
  • 你有其他线程在运行吗?
  • 有没有人引用中间列表。
  • 是否有悬挂context objects任何地方?

最后

如果你没有重现它的方法,很难修复错误,所以试着找到一种强制它的方法。喜欢:让应用程序在后台运行,并打开很多其他应用程序,然后再次返回音乐播放器。这可能会有问题,所以你不必自己做。

如果你能找到一种方法来重现它,那么只有在找到原因之后才开始消除代码。