Android实现ListView分页自动加载数据的方法

Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验。因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据。
下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListView列表的底部添加一个“查看更多...”按钮来加载新闻(模拟新闻客户端)分页数据。同时限定每次加载10条记录,但完全加载完数据后,就把ListView列表底部视图“查看更多...”删除。假设加载的数据总数为 38 条记录。先看下该Demo工程的程序结构图:

其中包 com.andyidea.bean中News.java类是新闻实体类,包com.andyidea.listview中paginationListViewActivity.java类是用来展示ListView列表。布局layout中包含三个布局文件,分别为:list_item.xml , loadmore.xml , main.xml 。下面分别贴下源码:
layout中的 list_item.xml源码:

<span style="font-size:13px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical">
 <TextView
   android:id="@+id/newstitle"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"/>
 <TextView
   android:id="@+id/newscontent"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"/>
</LinearLayout></span>

layout中loadmore.xml源码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <Button
   android:id="@+id/loadMoreButton"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="查看更多..." />
</LinearLayout>

layout中main.xml源码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <ListView
    android:id="@+id/lvNews"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>
</LinearLayou

包 com.andyidea.bean中News.java类源码:

package com.andyidea.bean;
public class News { 

  private String title;  //标题
  private String content; //内容 

  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getContent() {
    return content;
  }
  public void setContent(String content) {
    this.content = content;
  } 

}

包com.andyidea.listview中paginationListViewActivity.java类源码:

package com.andyidea.listview; 

import java.util.ArrayList;
import java.util.List; 

import com.andyidea.bean.News; 

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; 

public class PaginationListViewActivity extends Activity implements OnScrollListener { 

  private ListView listView;
  private int visibleLastIndex = 0;  //最后的可视项索引
  private int visibleItemCount;    // 当前窗口可见项总数
  private int datasize = 38;     //模拟数据集的条数
  private PaginationAdapter adapter;
  private View loadMoreView;
  private Button loadMoreButton;
  private Handler handler = new Handler();  

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main); 

    loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null);
    loadMoreButton = (Button)loadMoreView.findViewById(R.id.loadMoreButton);
    loadMoreButton.setOnClickListener(new View.OnClickListener() { 

      @Override
      public void onClick(View v) {
        loadMoreButton.setText("正在加载中...");  //设置按钮文字
        handler.postDelayed(new Runnable() { 

          @Override
          public void run() {
            loadMoreData();
            adapter.notifyDataSetChanged();
            loadMoreButton.setText("查看更多..."); //恢复按钮文字
          }
        },2000); 

      }
    }); 

    listView = (ListView)findViewById(R.id.lvNews);
    listView.addFooterView(loadMoreView);  //设置列表底部视图
    initializeAdapter();
    listView.setAdapter(adapter);
    listView.setOnScrollListener(this);
  } 

  @Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {
    int itemsLastIndex = adapter.getCount()-1; //数据集最后一项的索引
    int lastIndex = itemsLastIndex + 1;
    if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
        && visibleLastIndex == lastIndex) {
      // 如果是自动加载,可以在这里放置异步加载数据的代码
    }
  } 

  @Override
  public void onScroll(AbsListView view, int firstVisibleItem,
      int visibleItemCount, int totalItemCount) {
    this.visibleItemCount = visibleItemCount;
    visibleLastIndex = firstVisibleItem + visibleItemCount - 1; 

    Log.e("========================= ","========================");
    Log.e("firstVisibleItem = ",firstVisibleItem+"");
    Log.e("visibleItemCount = ",visibleItemCount+"");
    Log.e("totalItemCount = ",totalItemCount+"");
    Log.e("========================= ","========================"); 

    //如果所有的记录选项等于数据集的条数,则移除列表底部视图
    if(totalItemCount == datasize+1){
      listView.removeFooterView(loadMoreView);
      Toast.makeText(this, "数据全部加载完!", Toast.LENGTH_LONG).show();
    }
  } 

  /**
   * 初始化ListView的适配器
   */
  private void initializeAdapter(){
    List<News> news = new ArrayList<News>();
    for(int i=1;i<=10;i++){
      News items = new News();
      items.setTitle("Title"+i);
      items.setContent("This is News Content"+i);
      news.add(items);
    }
    adapter = new PaginationAdapter(news);
  } 

  /**
   * 加载更多数据
   */
  private void loadMoreData(){
    int count = adapter.getCount(); 

    if(count+10 <= datasize){
      for(int i=count+1; i<=count+10; i++){
        News item = new News();
        item.setTitle("Title"+i);
        item.setContent("This is News Content"+i);
        adapter.addNewsItem(item);
      }
    }else{
      for(int i=count+1; i<=datasize; i++){
        News item = new News();
        item.setTitle("Title"+i);
        item.setContent("This is News Content"+i);
        adapter.addNewsItem(item);
      }
    } 

  } 

  class PaginationAdapter extends BaseAdapter{ 

    List<News> newsItems; 

    public PaginationAdapter(List<News> newsitems){
      this.newsItems = newsitems;
    } 

    @Override
    public int getCount() {
      return newsItems.size();
    } 

    @Override
    public Object getItem(int position) {
      return newsItems.get(position);
    } 

    @Override
    public long getItemId(int position) {
      return position;
    } 

    @Override
    public View getView(int position, View view, ViewGroup parent) {
      if(view == null){
        view = getLayoutInflater().inflate(R.layout.list_item, null);
      } 

      //新闻标题
      TextView tvTitle = (TextView)view.findViewById(R.id.newstitle);
      tvTitle.setText(newsItems.get(position).getTitle());
      //新闻内容
      TextView tvContent = (TextView)view.findViewById(R.id.newscontent);
      tvContent.setText(newsItems.get(position).getContent()); 

      return view;
    } 

    /**
     * 添加数据列表项
     * @param newsitem
     */
    public void addNewsItem(News newsitem){
      newsItems.add(newsitem);
    } 

  } 

}

最后,运行程序的结果截图如下:

通过上面的截图,当我们点击"查看更多..."按钮时,就会加载下10条记录,当加载完所有的记录后,ListView的底部视图将会移除。

希望本文所述对大家学习Android软件编程有所帮助。

(0)

相关推荐

  • Android提高之SQLite分页读取实现方法

    一般来说,Android自身就包含了常用于嵌入式系统的SQLite,这样就免去了开发者自己移植安装的功夫.SQLite 支持多数SQL92标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLite数据库的操作.不过有跨平台需求的程序还是建议使用标准的SQL语句,毕竟这样容易在多个平台之间进行移植. 先来贴出本文程序运行的结果图: 本文实例程序主要讲解了SQLite的基本用法,如:创建数据库,使用SQL命令查询数据表.插入数据,关闭数

  • Android之ListView分页加载数据功能实现代码

    什么是ListView分页加载数据功能呢?在现在的大数据时代,我们不可能把某些数据全部展示到界面,好比我们经常会看的QQ空间一样,当你看动态的时候,系统不可能会把所有好友的动态都展示在上面,你能看到的一般都是最新好友更新的动态,假如你要看非最新的好友动态,通常你都会手指向上滑动屏幕然后去查看,当界面下滑到一定数量的时候,就会看到一个"查看更多",然后突然停顿一下,系统会通过网络去给你刷新其他动态信息,这样的功能我们一般叫做数据下拉刷新功能,也就是我们的分页加载功能,具体的实现是怎样的呢

  • Android开发中滑动分页功能实例详解

    本文实例讲述了Android开发中滑动分页功能.分享给大家供大家参考,具体如下: android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: Java代码: package cn.anycall.ju; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import andro

  • Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多

    最近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多. 新浪微博就是使用这种方式的典型. 当用户从网络上读取微博的时候,如果一下子全部加载用户未读的微博这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了,其实这个分页可以做成客户端的分页,也可以做成服务器端的分页(点击加载时,从服务器对应的加载第N页就好了!!!).通过分

  • android实现listview分页的方法

    本文实例讲述了android实现listview分页的方法.分享给大家供大家参考.具体分析如下: 最近做了下listview的分页,跟WEB上的分页是一个意思,需要那几个分页参数,不同的是sqlite中分页的查询语句,简便的方法需要用Limit,Offset关键字,前者是查询每页展示的记录数,后者是越过多少记录数,说得明白点就是忽略前面多少行记录之后,取多少行记录 我分页采用了一个重要的类Page,通过封装Page类,做为参数传递进来,返回出去也是个Page对象 import java.util

  • Android滑动动态分页实现方法

    本文实例讲述了Android滑动动态分页实现方法.分享给大家供大家参考,具体如下: 实现 Android.widget.AbsListView.OnScrollListener 主要代码: private int lastItemIndex; @Override public void onScroll(AbsListView v, int firstVisibleItem,int visibleItemCount, int totalItemCount) { lastItemIndex = f

  • Android实现基于滑动的SQLite数据分页加载技术(附demo源码下载)

    本文实例讲述了Android实现基于滑动的SQLite数据分页加载技术.分享给大家供大家参考,具体如下: main.xml如下: <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_settings" android:orderInCategory="100" android:showAs

  • Android中实现多行、水平滚动的分页的Gridview实例源码

    功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Gridview(一般是垂直滚动的)和Horizontalscrollview实现. (2)水平滚动翻页,下面有显示当前页的icon. 1.实现自定义的HorizontalScrollView(HorizontalScrollView.java): 因为要翻页时需要传当前页给调用者,所以fling函数中自己

  • Android App中使用ViewPager实现滑动分页的要点解析

    以前如果要做 Tab 分页的话,必须要用一个很难用的 TabActivity,而且做出来的效果很差,弹性也很小 忘了从什么时候开始,Google release 了 ViewPager 这好东西取代了以前难用的 Gallery 元件,加上从 Honeycomb 导入的 Fragment 之后终于能够简单做出好看又好用的 Layout 了! 这里我们采用PagerTabStrip ,做出来的效果如下 特色就是使用简单,出来的效果则是目前显示的分页 Tab 的文字会自动置中,然后分别在左右显示上一个

  • Android实现简单的分页效果

    本文实例为大家分享了Android分页效果的具体代码,供大家参考,具体内容如下 1.实现分页最主要的就是封装分页代码,然后在按钮里实现相关的操作 /** * 分页工具 * * @Project App_Page * @Package com.android.dividepage * @author chenlin * @version 1.0 * @Date 2012年6月2日 * @Note TODO * @param <T> */ public class PageHelper<T&

  • Android ListView分页功能实现方法

    通过本次小Demo我学到了: 1.ListView的小小的一个分页功能 2.加深了对自定义控件的理解 3.对ListView的优化 4.对BaseAdapter的使用 5.自定义Adapter 6.接口的回调 要实现下面的效果--当拖动ListView到底部的时候,显示一个ProgressBar和一个"正在加载..."的TextView.并且过两秒钟后,在下面加载出新的数据.项目的目录结构和程序要实现的效果如下:   首先是布局部分: 我为了实现此效果,首先在布局文件中新建了一个foo

随机推荐