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.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,以及布局文件,不在赘述

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

(0)

相关推荐

  • Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

    例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import COM.Example.Main.R; import COM.Example.Main.stringG

  • Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而Ima

  • 基于Android ListView之加载使用技巧

    程序员很多,遍地都是,高手也很多,但是懂设计的程序员并不多,我觉得我们不仅要成为一个coder还要成为一个designer. 我是一个比较注重ued的人,如果对一个app来说,程序是app的内涵那么设计就是要体现app的外在美观. 曾经看到一篇招聘用户体验设计师的信息问道 如果说,在我们身边,设计师具有表达思想的力量:工程师具有实现思想的力量. 那么请问用户体验设计师具有什么力量,有资格成为团队成员? 每个人有每个的思想每个人有每个人的见解,这就不多讲留给大家去思考. 我手机装的应用并不多,稍微

  • Android实现ListView分页自动加载数据的方法

    Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验.因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据. 下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListVie

  • Android实现ListView异步加载的方法(改进版)

    本文实例讲述了Android实现ListView异步加载的方法.分享给大家供大家参考,具体如下: @Override public View getView(int position, View convertView, ViewGroup parent) { ---- ViewHolder VH = null; ---- VH.mImageView.setTag(position); VH.mThumb.setImageDrawable(imageLoader.loadDrawable(pos

  • Android实现Listview异步加载网络图片并动态更新的方法

    本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法.分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片.店名.活动详情.地址.电话和距离等. 在布局文件中ListView的定义: <ListView android:id="@id/maplistview" android:background="@drawable/bg" android:layout_width=&qu

  • Android ListView异步加载图片方法详解

    本文实例讲述了Android ListView异步加载图片方法.分享给大家供大家参考,具体如下: 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,可能是在listview快速滑动屏幕的时候划过的item太多 而且每次调用getView方法后就会异步的在过去某个时间内用han

  • Android ListView实现上拉加载更多和下拉刷新功能

    本文实例为大家介绍了Android ListView下拉刷新功能的实现方法和功能,供大家参考,具体内容如下 1.ListView优化方式 界面缓存:ViewHolder+convertView 分页加载:上拉刷新 图片缓存 快速滑动ListView禁止刷新 2.效果 3.上拉加载更多原理及实现 当我们手指滑动到listview最后位置的时候,我们触发加载数据的方法.这触发之前我们需要做一些工作,包括: 如何判断滑动到最后? 如何避免重复加载数据? 加载之后如何刷新界面? 1).界面实现AbsLi

  • Android实现上拉加载更多以及下拉刷新功能(ListView)

    首先为大家介绍Andorid5.0原生下拉刷新简单实现. 先上效果图: 相对于上一个19.1.0版本中的横条效果好看了很多.使用起来也很简单. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" and

  • Android实现ListView异步加载图片的方法

    本文实例讲述了Android实现ListView异步加载图片的方法.分享给大家供大家参考.具体如下: ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReferen

随机推荐