一般透過網路載入資料時,通常會在後端開啟一個獨立之執行緒來作下載資料,此是目前採用最有效率的之作法,但若資料眾多則會造成等待時間過長,使得用戶體驗非常不好。故改進作法則是採用動態性載入資料,如第一次只載入十筆資料,然後往下滑動的時候再追加十筆,如此循環作業以可大大減少了用戶等待的時間,同時亦給處理資料留下效能。
主類之代碼如下:
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; //於代碼中實作Layout
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;
@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);
}
//建置Adapter連接資料
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;
}
}
};
}
運行結果如下圖:
.png)
