zoukankan      html  css  js  c++  java
  • Android 高级UI设计笔记09:Android实现无限滚动列表

    1. 无限滚动列表应用场景

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

    对于ListView和GridView一个共同基本要求是:当用户向下滚动时可以动态加载数据支持无限滚动。下面教你如何在自己的应用中实现这个特性。

      

    2. 实现无限滚动列表

    具体流程如下:

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

    InfiniteScrollListener.java

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

    (2)添加到事件到ListView中:

    YourActivity.java

    // 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数据发生改变。当然我们可以手动添加本地数据,也可以从数据库或者服务端来Load更多的数据。

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

  • 相关阅读:
    5-29
    5-28
    5-27
    -5-26
    5-25
    5-24
    5-21
    RabbitMQ消息中间件极速入门与实战
    细说java多线程之内存可见性
    全面解析java注解
  • 原文地址:https://www.cnblogs.com/hebao0514/p/5223554.html
Copyright © 2011-2022 走看看