zoukankan      html  css  js  c++  java
  • [Android]如何实现无限滚动的ListViw/GridView(翻译)

    ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式。目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验。

    对于ListView和GridView一个共同的需求就是在用户不断向下滚动,组件仍能动态的加载更多地加载更多数据。这篇博客就将带领大家实现在ListView和GridView中这个功能。

    我们需要的主要组件就是我们的InfiniteScrollListener类,这个类是继承于OnScrollListener,就让我们来看下具体的代码实现:

    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;
            }
        }
    }
    // 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/GridView的setOnScrollListener()方法,就像是第二个代码片段的匿名类。

    我们实现了InfiniteScrollListener类,我们也需要实现loadMore()方法,在这个方法里,我们可以给ListView/GridView添加Item并通过notifyDataSetChanged()通知ListView/GridView数据发生改变。当然我们可以手动添加本地数据,也可以l从数据库或者RESTful service来Load更多的数据。

    这就是我们在Android中实现的在ListView/GridView的可以无限滚动的所作的。对于有大量信息,ListView/GridView无疑有着很好的出处用户体验。

    原文:http://www.avocarrot.com/blog/implement-infinitely-scrolling-list-android/

  • 相关阅读:
    printcap
    browser-ua
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 72 编辑距离
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode 71 简化路径
    Java实现 LeetCode70 爬楼梯
  • 原文地址:https://www.cnblogs.com/Cyning/p/3817664.html
Copyright © 2011-2022 走看看