listView分批和分页加载数据

在Android应用程序中,有时候会向listView中加载很多数据,向listView中加载数据是一个耗时的过程,加载过多的数据用户停留在listView上,一直等待,给用户的体验特别不好,比如向服务器请求1000条数据,如果网络不好的话,就会导致这1000条数据一直在加载中。所以在应用程序中对listView中的数据进行分批或者是分页加载数据的话就会一批数据一批数据的加载数据,就不会一直加载1000条数据导致程序无响应。

首先穿件一个数据模型

package com.example.listviewdemo;public class PersonInfo {private String name;private String gender;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
创建数据库表格

package com.example.listviewdemo;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;public class ListViewDBOpenHelper extends SQLiteOpenHelper {/*** 数据库创建的构造方法* * @param context*/public ListViewDBOpenHelper(Context context) {super(context, "listviewtest.db", null, 1);}@Overridepublic void onCreate(SQLiteDatabase db) {// 初始化数据库的表结构db.execSQL("create table listview (_id integer primary key autoincrement,name varchar(20),gender varchar(20),age vachar(2))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}
操作数据库的方法

package com.example.listviewdemo;import java.util.ArrayList;
import java.util.List;import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;/*** 增删改查的业务* * @author Administrator* */
public class ListViewDAO {private ListViewDBOpenHelper helper;public ListViewDAO(Context context) {helper = new ListViewDBOpenHelper(context);}/*** 查找数据库中* * @param number* @return*/public boolean find(String name) {boolean reslut = false;SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from listview where name = ?",new String[] { name });if (cursor.moveToNext()) {reslut = true;}cursor.close();db.close();return reslut;}/*** 查找数据库* * @param number* @return 默认返回null*/public String findMode(String name) {String reslut = null;SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select gender from listview where name = ?",new String[] { name });if (cursor.moveToNext()) {reslut = cursor.getString(0);}cursor.close();db.close();return reslut;}/*** 添加* * @param number* @param mode*/public void add(String name, String gender,int age) {SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", name);values.put("gender", gender);values.put("age", age);db.insert("listview", null, values);db.close();}/*** 删除* * @param number* @param newmode*/public void delete(String number) {SQLiteDatabase db = helper.getWritableDatabase();db.delete("listview", "number=?", new String[] { number });db.close();}/*** 查找数据库中所有* * @param number* @return*/public List findAll() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}List reslut = new ArrayList();SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select name,gender,age from listview order by _id desc", null);while (cursor.moveToNext()) {PersonInfo info = new PersonInfo();String name = cursor.getString(0);String gender = cursor.getString(1);int age = cursor.getInt(2);info.setName(name);info.setGender(gender);info.setAge(age);reslut.add(info);}cursor.close();db.close();return reslut;}/*** 查找数据库中部分* * @param number* @return*/public List findPart(int offset, int maxnumber) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}List reslut = new ArrayList();SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select name,gender,age from listview order by _id desc limit ? offset ?",new String[] { String.valueOf(maxnumber),String.valueOf(offset) });while (cursor.moveToNext()) {PersonInfo info = new PersonInfo();String name = cursor.getString(0);String gender = cursor.getString(1);int age = cursor.getInt(2);info.setName(name);info.setGender(gender);info.setAge(age);reslut.add(info);}cursor.close();db.close();return reslut;}
}
实现了对数据库的增删改查,对于findPart这个方法是为了后面对listView分批和分页更新所用的方法。

实现类

package com.example.listviewdemo;import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends Activity {private ListView lv_callsms_safe;private List infos;private ListViewDAO dao;private ListViewAdapter adapter;private LinearLayout ll_loading;private int offset = 0;private int maxnumber = 20;@Overrideprotected void onCreate(Bundle savedInstanceState) {this.requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv_callsms_safe = (ListView) findViewById(R.id.lv_callsms_safe);ll_loading = (LinearLayout) findViewById(R.id.ll_loading);dao = new ListViewDAO(MainActivity.this);// 里面没有数据就插入一些数据if (dao.findAll() == null) {for (int i = 0; i < 100; i++) {dao.add("zhangsan" + i, "nan" + 1, 1 + i);}}infos = dao.findPart(offset, maxnumber);
//		adapter = new ListViewAdapter();
//		lv_callsms_safe.setAdapter(adapter);findblacknumber();// 注册一个滚动时间的监听器lv_callsms_safe.setOnScrollListener(new OnScrollListener() {// 当滚动状态放生改变时调用@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {switch (scrollState) {case OnScrollListener.SCROLL_STATE_IDLE: // 空闲状态// 判断当前listview滚动的位置// 获取最后一条可见条目在集合里面的位置int lastVisiblePosition = lv_callsms_safe.getLastVisiblePosition();System.out.println("最后一个可见条目的位置---" + lastVisiblePosition);// 到了最后一个可见位置后继续查找if (lastVisiblePosition == infos.size() - 1) {offset += maxnumber;findblacknumber();}break;case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 触摸状态break;case OnScrollListener.SCROLL_STATE_FLING: // 惯性滑行状态break;default:break;}}// 滚动时调用@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {}});}private void findblacknumber() {ll_loading.setVisibility(View.VISIBLE);new Thread(new Runnable() {@Overridepublic void run() {if (infos == null) {infos = dao.findPart(offset, maxnumber);} else {infos.addAll(dao.findPart(offset, maxnumber));}runOnUiThread(new Runnable() {public void run() {ll_loading.setVisibility(View.INVISIBLE);if (adapter == null) {adapter = new ListViewAdapter();lv_callsms_safe.setAdapter(adapter);} else {// adapter存在的话,通知更新adapter.notifyDataSetChanged();}}});}}).start();}private class ListViewAdapter extends BaseAdapter {@Overridepublic int getCount() {return infos.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(final int position, View convertView,ViewGroup parent) {View view;ViewHolder holder;if (convertView == null) {view = View.inflate(getApplicationContext(),R.layout.list_item, null);holder = new ViewHolder();holder.tv_item_name = (TextView) view.findViewById(R.id.tv_item_name);holder.tv_item_gender = (TextView) view.findViewById(R.id.tv_item_gender);holder.tv_item_age = (TextView) view.findViewById(R.id.tv_item_age);// 设置一个标示,当孩子生出来的时候找到他们的引用,存放在记事本里面,放在父亲的口袋view.setTag(holder);} else {view = convertView;holder = (ViewHolder) view.getTag();// 5%的效率提升}holder.tv_item_name.setText(infos.get(position).getName());holder.tv_item_gender.setText(infos.get(position).getGender());holder.tv_item_age.setText(infos.get(position).getAge() + "");return view;}}/*** view对象的容器,相当于一个记事本* * @author Administrator 静态的字节码只加载了一次*/static class ViewHolder {TextView tv_item_name;TextView tv_item_gender;TextView tv_item_age;}
}

对listView注册了一个滑动的监听器,当listView滑动到更新的最后一条数据,再次跟新数据,这样实现起来对于用户体验有很大的提高。

				if (infos == null) {infos = dao.findPart(offset, maxnumber);} else {infos.addAll(dao.findPart(offset, maxnumber));}
上面的程序是实现了分批的显示,如果要实现分页显示的话,只需要修改一下上面的代码为

infos = dao.findPart(offset, maxnumber);
就可以实现分页的更新。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部