问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android的分批加载是怎么实现的

发布网友 发布时间:2022-04-22 01:35

我来回答

1个回答

热心网友 时间:2024-03-04 20:04

每次滑动至底端,从数据库中获取10条数据,并加载于ListView中
数据库

package com.example.listviewbatchloading;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class PersonDb extends SQLiteOpenHelper {

public PersonDb(Context context) {
super(context, "creature", null, 1);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table people(_id integer primary key autoincrement,name char,number char)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("drop table people");
onCreate(db);
}

}

数据库的业务封装,其中获取更多数据的是核心代码

package com.example.listviewbatchloading;

/**
* 数据库的业务封装类
*/

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;

public class PersonList {

PersonDb personDb;

public PersonList(Context context){
this.personDb = new PersonDb(context);
}

/**
* 获取一定条目的数据
* @param startIndex
* 开始取数据的位置
* @param num
* 取多少条数据
*/
public List<Person> getMoreDatas(int startIndex,int num){

List<Person> list = new ArrayList<Person>();
SQLiteDatabase db = personDb.getWritableDatabase();
Cursor cursor = db.rawQuery("select name,number from people order by _id desc limit ?,?",
new String[]{startIndex + "",num + ""});

while(cursor.moveToNext()){
Person person = new Person();
person.setName(cursor.getString(cursor.getColumnIndex("name")));
person.setNumber(cursor.getString(cursor.getColumnIndex("number")));
list.add(person);
}

cursor.close();
db.close();

return list;

}

/**
* 添加数据库条目
* @param name
* @param number
*/
public void add(String name,String number){

SQLiteDatabase db = personDb.getWritableDatabase();

ContentValues cv = new ContentValues();
cv.put("name", name);
cv.put("number", number);

db.insert("people", null, cv);
db.close();
}

}

功能实现

package com.example.listviewbatchloading;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

private ListView lv ;
private List<Person> datas = new ArrayList<Person>();
private static int PERPAGE = 10; //每页加载数目
private static final int FINISH = 0;//数据加载完成
private List<Person> moreDatas;//每次加载的数据
private MyAdapter adapter;
private PersonList personList ;

//若数据较多,耗时较长,数据加载完成时,发送FINISH至handler,并通知ListView更新数据
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {

switch (msg.what) {
case FINISH:
if (moreDatas.size() != 0) {
System.out.println(moreDatas.toString());
adapter.notifyDataSetChanged();
}else {
Toast.makeText(MainActivity.this, "没有更多数据", Toast.LENGTH_SHORT).show();
}
break;

default:
break;
}

};
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initEvent();
}
/**
* 为ListView添加滚动监听事件,但滚动至最后一行时,加载更多数据
*/
private void initEvent() {
lv.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
int lastVisiblePosition = lv.getLastVisiblePosition();
if (lastVisiblePosition == datas.size() - 1) {
initData();
System.out.println("加载更多数据");
}
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub

}
});
}

private void initView() {

setContentView(R.layout.activity_main);

lv = (ListView) findViewById(R.id.lv);
personList = new PersonList(getApplicationContext());
adapter = new MyAdapter();
lv.setAdapter(adapter);
}

/**
* 在子线程中加载数据,避免主线程阻塞
*/
private void initData() {
new Thread() {

public void run() {

// 加载更多数据
moreDatas = personList.getMoreDatas(datas.size(), PERPAGE);

datas.addAll(moreDatas);// 把一个容器的所有数据加进来
// 取数据完成,发消息通知取数据完成
handler.obtainMessage(FINISH).sendToTarget();

};
}.start();
}

private class ItemView{
private TextView tv_name;
private TextView tv_num;
}

/**
* ListView的适配器
* @author lian
*
*/
private class MyAdapter extends BaseAdapter{

@Override
public int getCount() {
// TODO Auto-generated method stub
return datas.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

ItemView itemView = null;
if (convertView == null) {
itemView = new ItemView();
convertView = View.inflate(getApplicationContext(), R.layout.item_lv, null);
itemView.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
itemView.tv_num = (TextView) convertView.findViewById(R.id.tv_num);
convertView.setTag(itemView);
}else {
itemView = (ItemView) convertView.getTag();
}

Person person = datas.get(position);
itemView.tv_name.setText(person.getName());
itemView.tv_num.setText(person.getNumber());

return convertView;
}

}

}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
单位高温防护欠缺致员工中暑如何对待 狗狗为什么爱看视频 360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 松子仁可以生吃吗?怎样吃最有营养? android开发怎么存储数据 4&#8419;&#65039;室二两厅的房子,坐北朝南,有三个... 简述android平台提供了哪些数据存储方法 松子吃了有什么营养? 院子里的厕所窗户朝北好不好? Android数据库权限! 吃松子对人体有什么好处? 卫生间朝北风水好不好 android怎么从数据库读取一条数据赋值给字符串 厕所在..北面风水好吗 android 如何获取保存的图片的地址 并存到数据库中 请问卫生间在西北角或者卫生间在北面 但是西北角有... Android创建数据库需要做哪些事情 吃松仁有什么好处? 卫生间在房子的西北角在风水上好吗 android如何保存html文件,包括其中的图片。 楼房卫生间位于房子的西北方向风水不好吗?能破解吗? 使用android自带的日历控件怎么标记特定的 android 怎么读取数据库中的数据 卫生间在北面阳台墙上安镜子正对着窗户好吗? 房子门朝酉卫生间在南边好还是在北面好? 松子有什么营养 android query 模糊查询怎么使用 新房子的卫生间在西北角好吗 孕妇吃松子有什么好处呢? 家里厕所在北边方位怎么样? Android开发,请问TextView v=new TextView(this);... 松仁孕妇能吃吗? 座东北向西南的房子厨房和卫生间在哪个方位比较好? 厕所放在北方好吗? 吃松子有什么功效作用呢? 农村院子的厕所门朝北好不好 怎么化解 厕所门朝北好吗 万家乐的天工白玉热水器都有什么功能? 广发银行信用卡怎么怎么绑定etc 广发信用卡可以办理etc吗? 广发银行能不能办理etc业务 广发信用卡支持etc业务吗?个人应该怎么办理? 已经办理过广发信用卡如何申请etc