Android ListView加载控件

时间:2015-06-10 10:58:33

标签: android listview android-listview

我有一个列表,显示每个列表项的相当复杂的布局,滚动时有明显的滞后。是的,我已将其放入AsyncTask并使用了View Holder,如http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/http://developer.android.com/training/improving-layouts/smooth-scrolling.html

中所建议的那样

我认为接下来要尝试的是在页面加载时加载列表中的所有项目(即使那些将在屏幕外的项目),但我似乎无法找到一种方法来执行此操作。而且,是的,我知道这是一个非常糟糕的主意,并且在某种程度上违背了ListView的要点,如果您期望许多列表项。但是在我的情况下,我永远不应该有超过20个项目,而且当用户滚动时我无法想到还有什么可以让它更快。所以,我希望能够控制加载到我的ListView适配器中的内容,而不仅仅是采用“当时在屏幕上可见的任何内容”的默认值。

我想我从http://android.amberfog.com/?p=296How ListView's recycling mechanism works了解ListView回收的工作原理。但我看不到加载当前未出现在屏幕上的项目的方法,因此在用户滚动时不必创建新视图。所以我的问题是:是否可以在列表视图中加载屏幕项目,以便在用户滚动时不创建它们?如果是这样,怎么样?

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用此侦听器对象检测是否仍要在列表中呈现 visibleThreshold 项目数。并根据该条件激活您的Asynk任务,以便为列表中的其余元素预先加载数据。这种技术也用于添加Footer视图。

listenerObject = new AbsListView.OnScrollListener() {
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }

            public void onScroll(AbsListView view, int firstVisibleItem,
                                 int visibleItemCount, int totalItemCount) {

                int visibleThreshold = 3;
                if (loading == false && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
                    loading = true;
                    //DO YOUR JOB HERE i.e. your async task
                    // once your async Task is complete make loading as false

                }
            }
        };
lv.setOnScrollListener(listenerObject);

此处 lv 是列表视图。 如果您的数据已经加载,那么您不必担心视图创建,因为Android已经使用它来优化性能。