ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中。

先看看效果:

需要注意的是在什么时候去更新数据 ,listVIew的setOnScrollListener监听是否滚到了最后一条记录,

取到的数据加到list中,最后记得调用adapter的notifyDataSetChanged,通知listview改变。

不废话,上代码。

主文件:

mport java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.Toast; public class ListViewActivity extends Activity {
private ListView listView;
//定义适配器
private ListItemAdapter listadpter;
//定义每一页显示行数
private int VIEW_COUNT = ;
//定义的页数
private int index = ;
//当前页
private int currentPage = ;
//所以数据的条数
private int totalCount;
//每次取的数据,只要最后一次可能不一样。
private int maxResult;
//泛型集合ArrayList
private ArrayList<Students> arrayList = new ArrayList<Students>();
//数据操作的dao类
StudentsDAO dao = new StudentsDAO(ListViewActivity.this);
//实体bean
Students students = new Students();
// 标记:上次的ID private boolean isUpdating = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化界面
initView();
//插入100条记录。
dao.insert();
totalCount = dao.getCount();
maxResult = getMaxResult();
//调用dao里面的selectAll()方法
arrayList = dao.getAllItems(index, maxResult);
//实例化适配器
System.out.println("arrlist-->"+arrayList.size());
listadpter = new ListItemAdapter(ListViewActivity.this,arrayList);
//填充适配器
listView.setAdapter(listadpter); listView.setOnScrollListener(new OnScrollListener() { @Override
public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(firstVisibleItem + visibleItemCount == totalItemCount && !isUpdating){
if(totalItemCount<totalCount){ //防止最后一次取数据进入死循环。
Toast.makeText(ListViewActivity.this, "正在取第"+(++currentPage)+"的数据", Toast.LENGTH_LONG).show();
AsyncUpdateDatasTask asyncUpdateWeiBoDatasTask = new AsyncUpdateDatasTask();
asyncUpdateWeiBoDatasTask.execute();
}
System.out.println("begin update-------------");
}
}
});
}
//初始化界面方法
private void initView() {
// TODO Auto-generated method stub
listView = (ListView) findViewById(R.id.list);
}
class AsyncUpdateDatasTask extends AsyncTask<Void, Void, List<Students>> { @Override
protected List<Students> doInBackground(Void... params) {
// TODO Auto-generated method stub
isUpdating = true;
index += VIEW_COUNT;
List<Students> list =new ArrayList<Students>();
list = dao.getAllItems(index, maxResult);
return list;
}
@Override
protected void onPostExecute(List<Students> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
arrayList.addAll(result);
listadpter.notifyDataSetChanged();
isUpdating = false;
System.out.println("end update--------------");
}
}
private int getMaxResult(){
int totalPage = (totalCount+VIEW_COUNT-)/VIEW_COUNT;
return totalCount-(totalPage-)*VIEW_COUNT;
}
}

数据库Dao文件:

package com.shao.list;  

import java.util.ArrayList;
import java.util.Random; import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; public class StudentsDAO extends SQLiteOpenHelper { private final static String AUDIODATABASE_NAME = "student.db";
private final static String TABLE = "student";
private final static String COLUM_ID = "id";
private final static String COLUM_NAME = "name";
private final static String COLUM_AGE = "age";
private final static int DATABASE_VERSION = ;
private long row;
private ArrayList<Students> arrayList; public StudentsDAO(Context context) {
super(context, AUDIODATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql = "CREATE TABLE " + TABLE + " (" + COLUM_ID
+ " INTEGER primary key autoincrement, " + " " + COLUM_NAME
+ " text, " + " " + COLUM_AGE + " int)";
db.execSQL(sql);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
String sql = "DROP TABLE IF EXISTS " + TABLE;
db.execSQL(sql);
} public long insert() {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
Random random = new Random();
for(int i=;i<=;i++)
{
cv.put(COLUM_ID, i);
cv.put(COLUM_NAME, "name"+String.valueOf(i));
cv.put(COLUM_AGE, random.nextInt());
row = db.insert(TABLE, null, cv);
}
db.close();
return row;
}
//查询记录的总数
public int getCount() {
SQLiteDatabase db = getWritableDatabase();
String sql = "select count(*) from '"+TABLE+"'";
Cursor c = db.rawQuery(sql, null);
c.moveToFirst();
int length = c.getInt();
c.close();
db.close();
// System.out.println("length-->"+length);
return length;
}
public ArrayList<Students> getAllItems(int firstResult, int maxResult) {
arrayList=new ArrayList<Students>();
SQLiteDatabase db = getWritableDatabase();
String sql = "select * from '"+TABLE+"' limit ?,?";
Cursor cursor = db.rawQuery(sql, new String[]{String.valueOf(firstResult), String.valueOf(maxResult)});
if (cursor != null && cursor.getCount() > ) {
cursor.moveToFirst();
}
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Students students=new Students();
students.setId(cursor.getInt());
students.setName(cursor.getString());
students.setAge(cursor.getInt());
arrayList.add(students);
}
cursor.close();
db.close();
return arrayList;
} public ArrayList<Students> selectAll() {
arrayList=new ArrayList<Students>();
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.query(TABLE, null, null, null, null, null, null);
if (cursor != null && cursor.getCount() > ) {
cursor.moveToFirst();
}
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Students students=new Students();
students.setId(cursor.getInt());
students.setName(cursor.getString());
students.setAge(cursor.getInt());
arrayList.add(students);
}
cursor.close();
db.close();
return arrayList; } }

Android ListView动态更新数据的更多相关文章

  1. Android中动态更新ListView(转)

    在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中.实现步骤:调用ListView的setOnSc ...

  2. Android之ListView动态添加数据(SQLiteOpenHelper类添加数据)

    一.SQLiteOpenHelper类: 这次我们通过sqlite来动态添加数据,接下来我们创建一个openHelper.java,在前面sqlite博客中我们已经详细的讲了SQLite的创建及使用等 ...

  3. postgresql 存储过程动态更新数据

    -- 目标:动态更新表中数据 -- 老规矩上代码-----------------------------tablename 表名--feildname 字段名数组--feildvalue 字段值数组 ...

  4. Android AlertDialog 动态更新里面的ListView数据

    1:和ListView的数据跟新是基本一样的. 2:Activity代码示例 public class MainActivity extends AppCompatActivity { AlertDi ...

  5. android listView 滑动载入数据 该数据是服务端获取的

    package com.sunway.works.applycash; import java.util.ArrayList; import java.util.Calendar; import ja ...

  6. C#中使用ListView动态添加数据不闪烁并显示当前插入值

    首先,自定义一个类ListViewNF,继承自 System.Windows.Forms.ListView class ListViewNF : System.Windows.Forms.ListVi ...

  7. cocos2dx中android下动态更新.so文件

    作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037595.html  因为没用lua脚本写游戏,所以每次发布出去后,发现在bug,需要 ...

  8. 【Excle】动态更新数据下拉菜单

    现在我们制作了一个简单的下拉菜单,如下: 但是随着公司的逐渐扩大,部门也变得多了,目前我是把数据范围写死的 ,所有每次添加一个部门,就得修改数据范围,那么现在我们不想修改这个范围了,想让他每次添加部门 ...

  9. C#中使用ListView动态添加数据不闪烁(网上方法会出问题)

    最近需要使用做一个动态行显示,所以就用到了ListView控件,在网上也查到了关于动态添加不闪烁的方式都是如下: 首先,自定义一个类ListViewNF,继承自 System.Windows.Form ...

随机推荐

  1. 如何覆盖aar的资源

    1.首先理解一下aar的构造 classes.jar ----代码 res---资源文件 2.替换 查看res里面的资源文件,这个资源文件事实上都是跟安卓的资源文件夹是一样的.你只需要理解xml和里面 ...

  2. SQLserver中常用的函数及实例

    聚合函数 as是可以起别名的,在select和from之间的是表示列名,可以不加单引号)(聚合函数中的count不仅能对数字进行操作还能对字符型进行操作,其余的只能对数字操作) 最小值 select  ...

  3. jq选取对象的方法

     $("#找id的")$(".找样式的")  $("div[id]") 选择所有含有id属性的div元素 $("input[nam ...

  4. Word 2010巧妙绘制各种分割线的方法(图文)

    引用: 使用Word编辑文档时,可能为了使某些内容醒目显示,或者为了使文档内容显示的更美观.更有层次感,需要为文档添加一些分割线,如添加下框线.插入水平线.使用特殊符号快速绘制分割线等等.在Word ...

  5. rsync+inotity

    rsync默认端口:873xinetd默认服务 inotify参数详解inotifywait-r:递归-q:只打印事件-m:始终监听事件--excludei:排除--timefmt:时间格式--for ...

  6. PHP 类和继承

    //定义一个超类 //public 和 protectd属性和方法可以继承,private不可继承. class A{ public $a =0; private $b = 1; protected ...

  7. c#基础知识对比(面向对象)

    private,protected,public和internal private:是完全私有的,只有本类自己能用[好比自己的老婆,只有你自己可以调用,其他谁都不可以] protected:可被外界看 ...

  8. 51nod动态规划-----矩阵取数

    一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格. 1 3 3 2 1 3 2 2 1 能够获得的最 ...

  9. PHPCMS二次开发教程(转)

    转自:http://www.cnblogs.com/semcoding/p/3347600.html PHPCMS V9 结构设计 根目录 |–api  结构文件目录 |–caches 缓存文件目录 ...

  10. /dev/null 2>&1 解释(转)

    cmd >a 2>a 和 cmd >a 2>&1 为什么不同? cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍, ...