欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发中Listview动态加载数据的方法示例

程序员文章站 2023-12-15 09:44:10
本文实例讲述了android开发中listview动态加载数据的方法。分享给大家供大家参考,具体如下: 最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数...

本文实例讲述了android开发中listview动态加载数据的方法。分享给大家供大家参考,具体如下:

最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到listview中。我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好。我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间。网上看到了这样一个例子,挺好的,我改动了一下,达到了我想要的结果。

java代码:

package org.developerworks.android;
import android.app.activity;
import android.os.bundle;
import android.os.handler;
import android.os.message;
import android.view.gravity;
import android.view.view;
import android.view.viewgroup;
import android.widget.abslistview;
import android.widget.baseadapter;
import android.widget.linearlayout;
import android.widget.listview;
import android.widget.progressbar;
import android.widget.textview;
import android.widget.toast;
import android.widget.abslistview.onscrolllistener;
import android.widget.linearlayout.layoutparams;
public class listviewforloading extends activity implements onscrolllistener {
  private listviewadapter adapter = new listviewadapter();
  listview listview;
  linearlayout loadinglayout;
  private thread mthread;
  /** * 设置布局显示属性 */
  private layoutparams mlayoutparams = new linearlayout.layoutparams(
      linearlayout.layoutparams.wrap_content,
      linearlayout.layoutparams.wrap_content);
  /** * 设置布局显示目标最大化属性 */
  private layoutparams fflayoutparams = new linearlayout.layoutparams(
      linearlayout.layoutparams.fill_parent,
      linearlayout.layoutparams.fill_parent);
  private progressbar progressbar;
  /** called when the activity is first created. */
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    init();
  }
  private void init() {
    // todo auto-generated method stub
    // 线性布局
    linearlayout layout = new linearlayout(this);
    // 设置布局 水平方向
    layout.setorientation(linearlayout.horizontal);
    // 进度条
    progressbar = new progressbar(this);
    // 进度条显示位置
    progressbar.setpadding(0, 0, 15, 0);
    // 把进度条加入到layout中
    layout.addview(progressbar, mlayoutparams);
    // 文本内容
    textview textview = new textview(this);
    textview.settext("加载中...");
    textview.setgravity(gravity.center_vertical);
    // 把文本加入到layout中
    layout.addview(textview, fflayoutparams);
    // 设置layout的重力方向,即对齐方式是
    layout.setgravity(gravity.center);
    // 设置listview的页脚layout
    loadinglayout = new linearlayout(this);
    loadinglayout.addview(layout, mlayoutparams);
    loadinglayout.setgravity(gravity.center);
    // 得到一个listview用来显示条目
    listview = (listview) findviewbyid(r.id.tv);
    // 添加到脚页显示
    listview.addfooterview(loadinglayout);
    // 给listview添加适配器
    listview.setadapter(adapter);
    // 给listview注册滚动监听
    listview.setonscrolllistener(this);
  }
  /**
   * 要用用于生成显示数据
   *
   * @author huangbq
   */
  class listviewadapter extends baseadapter {
    int count = 10;
    public int getcount() {
      return count;
    }
    public object getitem(int pos) {
      return pos;
    }
    public long getitemid(int pos) {
      return pos;
    }
    public view getview(int pos, view v, viewgroup p) {
      textview view;
      if (v == null) {
        view = new textview(listviewforloading.this);
      } else {
        view = (textview) v;
      }
      view.settext("listitem " + pos);
      view.settextsize(20f);
      view.setgravity(gravity.center);
      view.setheight(60);
      return view;
    }
  }
  @override
  public void onscroll(abslistview view, int firstvisibleitem,
      int visibleitemcount, int totalitemcount) {
    // todo auto-generated method stub
    if (firstvisibleitem + visibleitemcount == totalitemcount) {
      // 开线程去下载网络数据
      if (mthread == null || !mthread.isalive()) {
        mthread = new thread() {
          @override
          public void run() {
            try {
              // 这里放你网络数据请求的方法,我在这里用线程休眠5秒方法来处理
              thread.sleep(5000);
            } catch (interruptedexception e) {
              e.printstacktrace();
            }
            message message = new message();
            message.what = 1;
            handler.sendmessage(message);
          }
        };
        mthread.start();
      }
    }
  }
  @override
  public void onscrollstatechanged(abslistview view, int scrollstate) {
    // todo auto-generated method stub
  }
  private handler handler = new handler() {
    @override
    public void handlemessage(message msg) {
      // todo auto-generated method stub
      switch (msg.what) {
      case 1:
        if (adapter.count <= 41) {
          adapter.count += 10;
          int currentpage = adapter.count / 10;
          toast.maketext(getapplicationcontext(),
              "第" + currentpage + "页", toast.length_long).show();
        } else {
          listview.removefooterview(loadinglayout);
        }
        // 重新刷新listview的adapter里面数据
        adapter.notifydatasetchanged();
        break;
      default:
        break;
      }
    }
  };
}

main.xml别忘了加这段了

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <listview android:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
</linearlayout>

更多关于android相关内容感兴趣的读者可查看本站专题:《android控件用法总结》、《android开发入门与进阶教程》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android数据库操作技巧总结》及《android资源操作技巧汇总

希望本文所述对大家android程序设计有所帮助。

上一篇:

下一篇: