2013-03-14 75 views
1

我有一个任务在ListView中显示数以千计的项目。所以我需要将这些项目的数据加载到内存中。但每个项目的数据都大于1KB,因此将所有数据加载到内存中将耗尽内存并导致OOM异常。事实上,我最初只加载这些数据的一部分,如果用户滚动到ListView的底部,更多的数据将被添加到ListView中。但是,如果用户保持滚动到底部,所有数据将最终加载到内存中,则出现OOM。如何将新项目添加到ListView的底部并同时从顶部删除旧项目?

为了解决这个问题,我想我可以设置一个最大限制的ListView的长度。例如,将最大长度设置为500.当用户保持滚动到ListView的底部时,将50个新项目添加到ListView的末尾,同时从顶部删除50个项目,因此最大长度的ListView保持不变。我知道如何添加新项目到最后并从ListView顶部删除旧项目,但是当我一起尝试这样做时会发生奇怪的事情,ListView的内容并不是我所期望的。

那么,谁知道如何解决我的问题?

任何有用的答案将不胜感激,但请不要问我改变项目的数据大小,因为我没有权利这样做。

伪代码(scrollListener被设置到ListView):

class MyOnScrollListener implements OnScrollListener{ 

    public void onScrollChange(View, int, int, int){ 
     if(reach the bottom){ 
      add50ItemsToTheBottomOfTheList(); 
      remove50FromTheTopOfTheList(); 
      myListViewAdapter.notifyDataSetChanged(); 
     } 
    } 

} 
+0

https://github.com/commonsguy/cwac-endless。尝试这个。 – Raghunandan 2013-03-14 16:15:17

+0

@Raghunandan我知道这个EndlessAdapter有一点,但不清楚当用户保持滚动到ListView的底部时它是否会将所有数据加载到内存中? – 2013-03-14 16:19:26

+0

为什么不发布关于同一标签commonsware和android的不同问题。我相信有人可以用无尽的滚动来帮助你。 – Raghunandan 2013-03-14 16:21:06

回答

0

我试图从ListView的顶部删除一些项目,但这样会导致异常行为到ListView。因此,我只是将列表顶部的这些项目设置为null,并在用户向后滚动时再次从网络加载它们。

相关问题