Android应用中使用ListView来分页显示刷新的内容
程序员文章站
2024-03-01 18:49:16
点击按钮刷新
1、效果如下:
实例如下: 上图的添加数据按钮可以换成一个进度条 因为没有数据所以我加了一个按钮添加到数据库用于测试;一般...
点击按钮刷新
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(); }