listView分批和分页加载数据
生活随笔
收集整理的這篇文章主要介紹了
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<PersonInfo> findAll() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}List<PersonInfo> reslut = new ArrayList<PersonInfo>();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<PersonInfo> findPart(int offset, int maxnumber) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}List<PersonInfo> reslut = new ArrayList<PersonInfo>();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<PersonInfo> 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滑動到更新的最后一條數據,再次跟新數據,這樣實現起來對于用戶體驗有很大的提高。
<span style="white-space:pre"> </span>if (infos == null) {infos = dao.findPart(offset, maxnumber);} else {infos.addAll(dao.findPart(offset, maxnumber));}上面的程序是實現了分批的顯示,如果要實現分頁顯示的話,只需要修改一下上面的代碼為
infos = dao.findPart(offset, maxnumber);就可以實現分頁的更新。
總結
以上是生活随笔為你收集整理的listView分批和分页加载数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u盘文件夹突然不显示不出来怎么办 U盘文
- 下一篇: Cocos2d—android 中常用的