热门标签 | 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(); 
  } 


推荐阅读
  • 本文介绍如何通过SSH协议使用Xshell远程连接到Ubuntu系统。为了实现这一目标,需要确保Ubuntu系统已安装并配置好SSH服务器,并保证网络连通性。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
author-avatar
杜庆坤66
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有