欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-29 08:12:22
点击按钮刷新 1、效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试;一般...

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

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

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

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(); 
  }