android动态加载列表,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别忘了加这段了

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值