当前位置: 移动技术网 > 移动技术>移动开发>Android > Android实现简单的分批加载ListView

Android实现简单的分批加载ListView

2019年07月24日  | 移动技术网移动技术  | 我要评论

每次滑动至底端,从数据库中获取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,以及布局文件,不在赘述

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网