热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

这篇文章主要介绍了Android应用中使用ListView来分页显示刷新的内容的方法,展示了一个点击按钮进行刷新的实例以及下拉刷新分页显示的要点解析,需要的朋友可以参考下

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

2016424161900539.png (480×854)2016424161920778.jpg (480×854)

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

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 getListNews(int page, DbSqliteNews dbnews) { 
  List list = new ArrayList(); 
  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(&#63;,&#63;)", 
      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 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; 
 } 
 
} 


 
 
  
  
 
  
 
  


<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
 
  
 
  
 
 

下拉刷新
当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(); 
  } 


推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文详细介绍了在Centos7上部署安装zabbix5.0的步骤和注意事项,包括准备工作、获取所需的yum源、关闭防火墙和SELINUX等。提供了一步一步的操作指南,帮助读者顺利完成安装过程。 ... [详细]
author-avatar
莫忠健
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有