您的位置:首页 > 移动开发 > Android开发

Android数据分批载入-滑动究竟部自己主动载入列表

2017-06-05 18:01 302 查看
Android数据分批载入-滑动究竟部自己主动载入列表

2014年5月9日

摘自:《Android高级开发实战—ui、ndk与安全》

本博文介绍怎样进行数据分批载入,在应用开发其中会常常使用到ListView。点击很多其它载入数据是我们常常简单,为了提供用户体验。当用户将列表滚动究竟部自己主动载入数据。这种形式用得比較多。

以下给大家提供的样例是,每次模拟20条数据,滑动究竟部时再请求20条数据直到请求到限定页数为止

详细代码实现:

/08_Datapageload/src/com/wwj/datapageload/MainActivity.java

package com.wwj.datapageload;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {
private ListView listView;
private List<String> data = new ArrayList<String>();
ArrayAdapter<String> adapter;
View footer;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
footer = getLayoutInflater().inflate(R.layout.footer, null);

listView = (ListView) findViewById(R.id.listView);
listView.setOnScrollListener(new ScrollListener());

// 模拟数据
data.addAll(DataService.getData(0, 20));
adapter = new ArrayAdapter<String>(this, R.layout.listview_item,
R.id.textView, data);
listView.addFooterView(footer);// 加入页脚(放在ListView最后)
listView.setAdapter(adapter);
listView.removeFooterView(footer);
}

private int number = 20; // 每次获取多少条数据
private int maxpage = 5; // 总共同拥有多少页
private boolean loadfinish = true; // 指示数据是否载入完毕

private final class ScrollListener implements OnScrollListener {

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
Log.i("MainActivity", "onScroll(firstVisibleItem="
+ firstVisibleItem + ",visibleItemCount="
+ visibleItemCount + ",totalItemCount=" + totalItemCount
+ ")");

final int loadtotal = totalItemCount;
int lastItemid = listView.getLastVisiblePosition(); // 获取当前屏幕最后Item的ID
if ((lastItemid + 1) == totalItemCount) { // 达到数据的最后一条记录
if (totalItemCount > 0) {
// 当前页
int currentpage = totalItemCount % number == 0 ? totalItemCount
/ number
: totalItemCount / number + 1;
int nextpage = currentpage + 1; // 下一页
if (nextpage <= maxpage && loadfinish) {
loadfinish = false;
listView.addFooterView(footer);

// 开一个线程载入数据
new Thread(new Runnable() {

@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
List<String> result = DataService.getData(
loadtotal, number);
// 发送消息
handler.sendMessage(handler.obtainMessage(100,
data));
}
}).start();
}
}
}

}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.i("MainActivity", "onScrollStateChanged(scrollState="
+ scrollState + ")");
}

}

private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
data.addAll((List<String>) msg.obj);
// 告诉ListView数据已经发生改变。要求ListView更新界面显示
adapter.notifyDataSetChanged();
if (listView.getFooterViewsCount() > 0) { // 假设有底部视图
listView.removeFooterView(footer);
}
loadfinish = true; // 载入完毕
};
};

}


/08_Datapageload/src/com/wwj/datapageload/DataService.java

package com.wwj.datapageload;

import java.util.ArrayList;
import java.util.List;

public class DataService {
public static List<String> getData(int offset, int maxResult) { // 分页limit
// 0,20
List<String> data = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
data.add("ListView数据的分批载入" + i);
}
return data;

}
}


效果图例如以下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: