列表和网格是安卓原生应用程序中使用最广泛的两个设计组件。开发者之所以大量使用它们,因为它们虽然实现起来简单明了,但提供了简洁、优良的用户体验。

使用列表和网格的一个基本要求是,当用户向下滚动时可以动态加载数据支持无限滚动。这篇博客将教你如何在自己的应用中实现这个特性。

我们需要的一个主要组件是InfiniteScrollListener类,它实现了OnScrollListener接口。让我们直接看下面这个类的代码实现:

InfiniteScrollListener.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public abstract class InfiniteScrollListener implements AbsListView.OnScrollListener {
    private int bufferItemCount = 10;
    private int currentPage = 0;
    private int itemCount = 0;
    private boolean isLoading = true;
    public InfiniteScrollListener(int bufferItemCount) {
        this.bufferItemCount = bufferItemCount;
    }
    public abstract void loadMore(int page, int totalItemsCount);
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // Do Nothing
    }
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
    {
        if (totalItemCount < itemCount) {
            this.itemCount = totalItemCount;
            if (totalItemCount == 0) {
                this.isLoading = true; }
        }
        if (isLoading && (totalItemCount > itemCount)) {
            isLoading = false;
            itemCount = totalItemCount;
            currentPage++;
        }
        if (!isLoading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + bufferItemCount)) {
            loadMore(currentPage + 1, totalItemCount);
            isLoading = true;
        }
    }
}

YourActivity.java

1
2
3
4
5
6
7
8
9
// Attach the listener to the AdapterView onCreate
yourListView.setOnScrollListener(new InfiniteScrollListener(5) {
    @Override
    public void loadMore(int page, int totalItemsCount) {
        List<HashMap<String, String>> newData = loader.loadData();
        dataList.addAll(newData);
        adapter.notifyDataSetChanged();
    }
});

如你所见,把这个类声明为抽象类。InfiniteScrollListener包含一个已实现的onScroll方法,但同时定义了一个抽象方法loadMore()——当我们继承这个类的时候需要实现该方法。

当用户滚动列表的时候,安卓运行时环境会自动调用onScroll方法。因为它会被频繁调用,所以建议避免在这个方法中做繁重的处理或者大量资源计算。

为实现无限滚动列表,我们仅需实现InfiniteScrollListener类,并使用ListView的setOnScrollListener()设置。我们可以用一个匿名类实现,就像上面第二段代码展示的那样。

在实现InfiniteScrollListener时,需要实现LoadMore方法。在此方法中我们可以生成想添加到列表中的新条目,然后使用我们适配器的notifyDataSetChanged方法添加上去。你可能要自己生成数据,也可以从数据库或者服务端加载。

这就是安卓中实现无限滚动列表所需要做的全部做工。列表是一种向用户批量展示信息同时又带来不错体验的方法。如果你的应用中已经有ListView或者你打算实现一个,下载我们的Native Ads SDK,它允许在你自己的列表中完全自定义广告。不过10分钟,在不影响用户体验的情况下,应用就可以为你赚更多的钱了。可以从这里检出代码。