完成splash之後,便開始製作列表頁。就像之前說的,列表頁具有更新和分頁的功能,這兩個功能都是很常見的。為了使列表支援拖動重新整理功能,這裡我用到了一個開源外掛程式PullToRefreshListView,這個開源的組件可以使列表頁擁有拖動更新的功能。
這是由 johannilsson 以及眾位其好友的研究成果,並已 Apache 2.0 協議開源託管在 Github:https://github.com/johannilsson/android-pulltorefresh,具體如下:
他的原理是繼承listview,並利用headview,配合上ontouch和onscroll來檢測使用者下拉和上滑的動作來實現這種效果。
有了PullToRefreshListView之後,我們的列表就有了下拉更新功能,再配合上footview我們就可以實現分頁功能了。至此,UI部分沒什麼好講的。再來看看背景工作執行緒,我們大概要建立兩個背景工作執行緒,一個負責更新,一個負責取當前列表及其分頁。
這裡我們既可以使用Thread+Handler+Message的方式,也可以是用AsyncTask來建立背景工作執行緒,
如更新部分我們使用了AsyncTask:
private class GetDataTask extends AsyncTask<Void, Void, List<News>> {
@Override
protected List<News> doInBackground(Void params) {
// Simulates a background job.
// 更新擷取資料
try {
if (ApplicationEx.isNetworkConnected(CiReader.this)) {
List<News> updatelist = HttpDataService
.getNewsListForUpdate(CiReader.this, cur_tab,
firstItem, LIMIT);
// 儲存
if (updatelist != null && !updatelist.isEmpty()) {
Iterator<News> iter = updatelist.iterator();
while (iter.hasNext()) {
News news = iter.next();
news.storageNews(CiReader.this);
((LinkedList<News>) list).addFirst(news);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
@Override
protected void onPostExecute(List<News> result) {
// mListItems.addFirst("Added after refresh");
if (!ApplicationEx.isNetworkConnected(CiReader.this)) {
Tools.displayMsg(CiReader.this, "無網路連接");
}
// Call onRefreshComplete when the list has been refreshed.
pulltorefreshlist.onRefreshComplete();
super.onPostExecute(result);
}
}
取列表及分頁資料的AsyncTask:
class MoreAsyncTask extends AsyncTask<Void, Void, List<News>> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
loadingbutton.setText("正在載入");
System.out.println("pre");
}
protected List<News> doInBackground(Void arg0) {
// TODO Auto-generated method stub
// 取最新20條
List<News> addlist = DBUtil.getNewsListByCategory(CiReader.this,
cur_tab, lastItem, LIMIT);
if (addlist == null || addlist.isEmpty()) {
// 申請網路,取20條資料,沒有任何資料,
// 在splash裡面完成前20條資料的載入
if (ApplicationEx.isNetworkConnected(CiReader.this)) {
addlist = HttpDataService.getNewsList(CiReader.this,
cur_tab, lastItem, LIMIT);
// 儲存
if (addlist != null && !addlist.isEmpty()) {
Iterator<News> iter = addlist.iterator();
while (iter.hasNext()) {
News news = iter.next();
news.storageNews(CiReader.this);
}
}
System.out.println("test3");
} else {
// 無網路連接
}
} else if (addlist.size() < LIMIT) {
// 申請網路,去取不足的部分,這時需要得到
// 第一條資料的content_file_name這個欄位值
if (ApplicationEx.isNetworkConnected(CiReader.this)) {
lastItem = addlist.get(addlist.size() - 1)
.getContent_file_name();
List<News> addlist2 = HttpDataService.getNewsList(
CiReader.this, cur_tab, lastItem,
LIMIT - addlist.size());
if (addlist2 != null && !addlist2.isEmpty()) {
addlist.addAll(addlist2);
Iterator<News> iter2 = addlist2.iterator();
while (iter2.hasNext()) {
News news = iter2.next();
news.storageNews(CiReader.this);
}
}
} else {
// 無網路連接
}
}
if (addlist != null && !addlist.isEmpty()) {
list.addAll(addlist);
News lastnews = addlist.get(addlist.size() - 1);
lastItem = lastnews.getContent_file_name();
}
System.out.println("back");
return addlist;
}
@Override
protected void onPostExecute(List<News> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
System.out.println("post");
if (result != null && !result.isEmpty()) {
loadingbutton.setText("查看下面20條結果");
footview.setVisibility(View.GONE);
} else if (!ApplicationEx.isNetworkConnected(CiReader.this)) {
Tools.displayMsg(CiReader.this, "無網路連接");
} else {
loadingbutton.setText("沒有了");
loadingbutton.setOnClickListener(null);
}
}
}分頁是利用了footview來顯示的:
private class scrollListener implements OnScrollListener{
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
switch (scrollState){
case OnScrollListener.SCROLL_STATE_IDLE:
if (view.getLastVisiblePosition() == (view.getCount() - 1)){
footview.setVisibility(View.VISIBLE);
}
}
}
}
}
講到這裡列表頁的關鍵問題就講完了,代碼裡面還有涉及到從網路取資料存本機資料庫的部分。這又涉及到一些sqlite的操作,這個可以放到後面再講一些自己的心得。下面一講將內容頁是如何製作的。
作者“風之子的部落格”