热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Android实现简单的分批加载ListView

这篇文章主要介绍了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 getMoreDatas(int startIndex,int num){ 
     
    List list = new ArrayList(); 
    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 datas = new ArrayList(); 
  private static int PERPAGE = 10; //每页加载数目 
  private static final int FINISH = 0;//数据加载完成 
  private List 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,以及布局文件,不在赘述

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


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • docker增加restart=always, docker重启后自动启动容器的方法
    本文介绍了在运行docker容器时如何添加参数来保证每次docker服务重启后容器也自动重启的方法,以及如何使用命令来更新已启动的容器。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
author-avatar
假猫t_950
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有