Android实现简单的分批加载ListView_Android

每次滑动至底端,从数据库中获取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;
    } 

  } 

}

其他Person的JavaBean,以及布局文件,不在赘述

以上就是本文的全部内容,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索listview分批加载、listview分批加载数据、listview实现上拉加载、listview实现分页加载、js分批加载数据,以便于您获取更多的相关知识。

时间: 2024-09-16 16:25:39

Android实现简单的分批加载ListView_Android的相关文章

Android实现简单的分批加载ListView

每次滑动至底端,从数据库中获取10条数据,并加载于ListView中 数据库 package com.example.listviewbatchloading; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlit

android Html内容如何预先加载到缓存,提高webview刷新速度呢

问题描述 android Html内容如何预先加载到缓存,提高webview刷新速度呢 因为在webview加载html内容的时候,需要解析html内容,再加载到webview里面,导致显示速度比较慢,如何在得到html内容的前提下,预先加载到缓存,提高webview的显示速度呢? 解决方案 浏览器的作用就是将得到的数据显示出来,跟你得到文本流再在textview中显示一样,你说的渲染太耗时除非是你过去网络资源时没有开辟子线程,或者要显示的图形或者js太复杂.另外webview相当于你使用了一个

Android WebKit HTML主资源加载过程

Android WebKit HTML主资源加载过程 前言 在浏览器里面输入网址,最终浏览器会调用WebView的loadUrl(),然后就开始加载整个网页.整个加载过程中,最重要的一步就是HTML主资源的加载.WebKit将网页的资源分为主资源(MainResource)和子资源(SubResource). WebKit资源分类 主资源:HTML文件. 子资源:CSS, JS, JPG等等,除了HTML文件之外的所有资源都称之为子资源 本章主要讲主资源的加载过程,子资源的加载过程后期会专门详细

Android编程之四种Activity加载模式分析_Android

本文分析讲述了Android编程之四种Activity加载模式.分享给大家供大家参考,具体如下: Activity状态 一般认为Activity有以下四种状态: ① 活动的:当一个Activity在栈顶,它是可视的.有焦点.可接受用户输入的.Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用.当另外一个Activity被激活,这个将会被暂停. ② 暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了.有可

Android App中使用Glide加载图片的教程_Android

与其他图片加载库相同,Glide除了可以加载网络图片之外,也可以加载本地图片.甚至还可以从各种各样奇葩的数据源中加载图片. 加载网络图片很多情况下,我们使用图片加载库就是为了加载网络图片.网络操作是一个很复杂的东西.试想一下,如果没有图片加载库,我们就要手动去下载图片,缓存图片,最后再从文件里面读取bitmap并设置到Imageview里面.这还算好的,要是在Listview里面你会更头疼的.原因我就不说了,你懂的~~再加上各种各样的Bitmap操作,保准你再也不想撸代码了.而且Bitmap这东

Android仿支付宝笑脸刷新加载动画的实现代码_Android

看到支付宝的下拉刷新有一个笑脸的动画,因此自己也动手实现一下.效果图如下: 一.总体思路 1.静态部分的笑脸. 这一部分的笑脸就是一个半圆弧,加上两颗眼睛,这部分比较简单,用于一开始的展示. 2.动态笑脸的实现. 2.1.先是从底部有一个圆形在运动,运动在左眼位置时把左眼给绘制,同时圆形继续运动,运动到右眼位置时绘制右眼,圆形继续运动到最右边的位置. 2.2.当上面的圆形运动到最右边时候,开始不断绘制脸,从右向左,脸不断增长,这里脸设置为接近半个圆形的大小. 2.3.当脸画完的时候,开始让脸旋转

Android使用控件ImageView加载图片的方法_Android

在 Android 加载图片一般使用 ImageView,这里简单记录一下这个控件的使用方法. 最简单就是在 xml 里直接使用 ImageView 标签: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="

Android使用原生组件WebView加载网页和数据的方法_Android

在Api中关于这个类的介绍大致就是这是一个可以显示网页的视图,如: webView.loadUrl(http://www.baidu.com/); 显示结果: 还可以加载一些html的字符串,如: String str = "<html><body>You scored <b>192</b> points.</body></html>"; webView.loadData(str, "text/html&

Android编程之四种Activity加载模式分析

本文分析讲述了Android编程之四种Activity加载模式.分享给大家供大家参考,具体如下: Activity状态 一般认为Activity有以下四种状态: ① 活动的:当一个Activity在栈顶,它是可视的.有焦点.可接受用户输入的.Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用.当另外一个Activity被激活,这个将会被暂停. ② 暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了.有可