Android应用中使用ListView来分页显示刷新的内容

点击按钮刷新
1、效果如下:

实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试;一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户:
点击加载按钮的时候,向数据库读取一次数据,把读取的数据追加到原来的数据集中;然后显示出来

package com.exampleandroid.xiong.listviewpages; 

public class News {
 private String title;
 private int id; 

 /**
  *
  * @return 返回新闻标题
  */
 public String getTitle() {
  return title;
 } 

 /**
  *
  * @param title
  *   设置新闻标题
  */
 public void setTtitle(String title) {
  this.title = title;
 } 

 /**
  *
  * @return 返回新闻标识
  */
 public int getId() {
  return id;
 } 

 /**
  *
  * @param id
  *   设置新闻标识
  */
 public void setId(int id) {
  this.id = id;
 }
}
package com.exampleandroid.xiong.listviewpages; 

import java.util.ArrayList;
import java.util.List;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; 

public class GetNews { 

 /**
  *
  * @param page
  *   需要加载的页数 每页数据5条
  * @param dbnews
  *   SQLiteOpenHelper子类
  * @return 返回新闻加载的数据
  */
 public List<News> getListNews(int page, DbSqliteNews dbnews) {
  List<News> list = new ArrayList<News>();
  String sql = "select * from tb_newstile where news_id not in(select news_id from tb_newstile LIMIT "
    + 5 * (page - 1) + ") LIMIT " + 5 * page;
  Cursor cursor = dbnews.getReadableDatabase().rawQuery(sql, null);
  while (cursor.moveToNext()) {
   News news = new News();
   news.setTtitle(cursor.getString(1));
   news.setId(cursor.getInt(0));
   list.add(news);
  }
  cursor.close();
  return list;
 } 

 /**
  * 插入100条数据用于测试
  *
  * @param dbnews
  *   SQLiteOpenHelper子类
  */
 public void insertData(DbSqliteNews dbnews) {
  SQLiteDatabase datas = dbnews.getWritableDatabase();
  datas.beginTransaction();
  try {
   for (int i = 0; i < 100; i++) {
    datas.execSQL("insert into tb_newstile values(?,?)",
      new Object[] { i, "新闻标题" + i });
   }
   datas.setTransactionSuccessful();
  } catch (Exception e) {
   System.out.println("数据插入失败!");
   e.printStackTrace();
  } finally {
   datas.endTransaction();
  } 

 }
}
package com.exampleandroid.xiong.listviewpages; 

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; 

public class DbSqliteNews extends SQLiteOpenHelper { 

 public DbSqliteNews(Context context, String name, CursorFactory factory,
   int version) {
  super(context, name, factory, version);
 } 

 // 创建数据库表
 @Override
 public void onCreate(SQLiteDatabase db) {
  db.execSQL("create table tb_newstile(news_id integer ,news_title varchar(100))");
 } 

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

 } 

}
package com.exampleandroid.xiong.listviewpages; 

import java.util.List; 

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView; 

public class MainActivity extends Activity { 

 private ListView newShow_list;
 private Button loadmore, adddata;
 // ListView加载的数据
 private List<News> shownews;
 private GetNews getnews;
 private DbSqliteNews dbnews;
 // 加载的页数
 private int pagecount = 1; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  newShow_list = (ListView) findViewById(R.id.newsShow_list);
  loadmore = (Button) findViewById(R.id.loadmore_bt);
  adddata = (Button) findViewById(R.id.adddata);
  dbnews = new DbSqliteNews(this, "new.db", null, 1);
  getnews = new GetNews();
  final ListAdpaterNews listadpter=new ListAdpaterNews();
  //此按钮只为添加测试数据
  adddata.setOnClickListener(new OnClickListener() { 

   @Override
   public void onClick(View v) {
    //插入数据
    getnews.insertData(dbnews);
    //获取数据
    shownews = getnews.getListNews(pagecount, dbnews);
    //显示数据
    newShow_list.setAdapter(listadpter);
   }
  });
  loadmore.setOnClickListener(new OnClickListener() { 

   @Override
   public void onClick(View v) {
    pagecount++;
    //将数据追加到原集合
    shownews.addAll(getnews.getListNews(pagecount, dbnews));
    //刷新数据
    listadpter.notifyDataSetInvalidated();
   }
  });
  // 第一次加载的数据
  shownews = getnews.getListNews(pagecount, dbnews);
  newShow_list.setAdapter(listadpter); 

 } 

 class ListAdpaterNews extends BaseAdapter { 

  @Override
  public int getCount() {
   return pagecount * 5;
  } 

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

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

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
   View view = LayoutInflater.from(MainActivity.this).inflate(
     R.layout.news_title, null);
   TextView txttitle = (TextView) view.findViewById(R.id.txt_title);
   ImageView images = (ImageView) view
     .findViewById(R.id.showimage_title);
   images.setBackgroundResource(R.drawable.n_me_l);
   txttitle.setText(shownews.get(position).getTitle());
   return view;
  } 

 } 

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 } 

}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity" > 

 <ListView
  android:id="@+id/newsShow_list"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >
 </ListView> 

 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_alignParentBottom="true" > 

  <Button
   android:id="@+id/adddata"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_weight="1"
   android:text="添加数据" /> 

  <Button
   android:id="@+id/loadmore_bt"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_weight="1"
   android:text="@string/loadmore" />
 </LinearLayout> 

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:padding="15dp"
 android:orientation="horizontal" > 

 <ImageView
  android:id="@+id/showimage_title"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/n_me_l"
  android:contentDescription="@string/imagenews" /> 

 <TextView
  android:id="@+id/txt_title"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" /> 

</LinearLayout>

下拉刷新
当ListView要显示的数据过多时,为了更快的响应用户,这个时候ListView进行分页显示再合适不过了。
ListView分页显示数据的原理其实很简单,当用户滑到ListView最后一项时,通知异步线程进行加载下一页的数据,下一页数据加载完成时,调用设置好的Adapter的notifyDataSetChange()方法,ListView显示下一页的数据。
现在有两个问题要解决,第一个问题要知道用户是否滑到了ListView的最后一项;第二个问题是如何提示用户正在加载下一页的数据,让用户耐心等待。
解决第一个问题,我们只需自定义ListView,让它实现OnScrollListener类监听ListView的滑动状态,以此来判断是否滑动到了最后一项
这里只简单说一下要点:

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

  if (getAdapter() == null){
    return ;
  } 

  if (getAdapter().getCount() == 0){
    return ;
  } 

  int lastItemIndex = firstVisibleItem + visibleItemCount;
  if (lastItemIndex >= totalItemCount){
    // 用户已经滑动到了ListView的最后一项
  }

要解决第二个问题也是在onScroll()方法中来实现

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

  if (getAdapter() == null){
    return ;
  } 

  if (getAdapter().getCount() == 0){
    return ;
  } 

  int lastItemIndex = firstVisibleItem + visibleItemCount;
  if (lastItemIndex >= totalItemCount && ! isLoading){
   addFooterView( footerView );//用来提示用户正在加载下一页的数据
    isLoading = true ;
    listener.loadData();
  }
(0)

相关推荐

  • Android ListView分页功能实现方法

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

  • Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解

    本文实例讲述了Android操作SQLite数据库(增.删.改.查.分页等)及ListView显示数据的方法.分享给大家供大家参考,具体如下: 由于刚接触android开发,故此想把学到的基础知识记录一下,以备查询,故此写的比较啰嗦: 步骤如下: 一.介绍: 此文主要是介绍怎么使用android自带的数据库SQLite,以及把后台的数据用ListView控件显示 二.新建一个android工程--DBSQLiteOperate 工程目录: 三.清单列表AndroidManifest.xml的配置

  • android实现listview分页的方法

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

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

    Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验.因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据. 下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListVie

  • Android实现listview动态加载数据分页的两种方法

    在android开发中,经常需要使用数据分页,比如要实现一个新闻列表的显示,或者博文列表的显示,不可能第一次加载就展示出全部,这就需要使用分页的方法来加载数据,在android中Handler经常用来在耗时的工作中,它接收子线程发送的数据,并使用数据配合更新UI,AsyncTask是在一个线程中执行耗时操作然后把结果传给UI线程,不需要你亲自去管理线程和句柄. 一.使用Handler+线程方法 1.基础知识 Handler在android系统中,主要负责发送和接收消息,它的用途主要有以下两种:

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

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

  • Android应用中ListView利用OnScrollListener分页加载数据

    当用户从网络上读取微薄的时候,如果一下子全部加载用户未读的微薄这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了.通过分页分次加载数据,用户看多少就去加载多少. 通常这也分为两种方式,一种是设置一个按钮,用户点击即加载.另一种是当用户滑动到底部时自动加载.今天我就和大家分享一下这个功能的实现. 首先,写一个xml文件,moredata.xml,该文件即定义了放在listview底部的视图: <?xml

  • Android中ListView如何分页加载数据

    熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容.通常来说,一个应用在展现大量数据时,不会将全部的可用数据都呈现给用户,因为这不管对于服务端还是客户端来说都是不小的压力,因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.比如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"加载更多"按钮,用户点

  • android listview优化几种写法详细介绍

    这篇文章只是总结下getView里面优化视图的几种写法,就像孔乙己写茴香豆的茴字的几种写法一样,高手勿喷,勿笑,只是拿出来分享,有错误的地方欢迎大家指正,谢谢. listview Aviewthatshowsitemsinaverticallyscrollinglist. 一个显示一个垂直的滚动子项的列表视图在android开发中,使用listview的地方很多,用它来展现数据,成一个垂直的视图.使用listview是一个标准的适配器模式,用数据--,界面--xml以及适配器--adapter,

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

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

随机推荐