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

 更新时间:2016年04月24日 16:22:06   作者:剑萧舞蝶  
这篇文章主要介绍了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<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(); 
  } 

相关文章

  • Android自定义带水滴的进度条样式(带渐变色效果)

    Android自定义带水滴的进度条样式(带渐变色效果)

    这篇文章主要介绍了Android自定义带水滴的进度条样式(带渐变色效果)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • Android实现通讯录功能

    Android实现通讯录功能

    这篇文章主要为大家详细介绍了Android实现通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Android中volley封装实践记录(二)

    Android中volley封装实践记录(二)

    这篇文章主要给大家介绍了关于Android中volley封装的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Android编程实现分页加载ListView功能示例

    Android编程实现分页加载ListView功能示例

    这篇文章主要介绍了Android编程实现分页加载ListView功能,结合实例形式分析了listview分页加载的原理、实现技巧与相关注意事项,需要的朋友可以参考下
    2017-02-02
  • Android自定义View中Paint、Rect、Canvas介绍(一)

    Android自定义View中Paint、Rect、Canvas介绍(一)

    这篇文章主要为大家详细介绍了Android自定义View中Paint、Rect、Canvas的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android 打开网络上pdf文件

    Android 打开网络上pdf文件

    本文主要介绍了Android打开网络上pdf文件的方法,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • 制作独立的Android模拟器实现方法

    制作独立的Android模拟器实现方法

    本文主要介绍如何制作独立的Android模拟器,这里给大家提供详细的制作流程,有需要的小伙伴可以参考下
    2016-08-08
  • 关于Android冷启动耗时优化详解

    关于Android冷启动耗时优化详解

    大家好,本篇文章主要讲的是关于Android冷启动耗时优化详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Android的APK应用签名机制以及读取签名的方法

    Android的APK应用签名机制以及读取签名的方法

    这篇文章主要介绍了Android的APK应用签名机制以及读取签名的方法,这里作者推荐使用Java自带的API进行APK签名的读取,需要的朋友可以参考下
    2016-02-02
  • Android中BaseAdapter用法示例

    Android中BaseAdapter用法示例

    这篇文章主要介绍了Android中BaseAdapter用法,分析了BaseAdapter的功能、使用方法与相关注意事项,需要的朋友可以参考下
    2016-08-08

最新评论