看板 KnucklesNote
作者 標題 [AndroidStudio] 在ListView下方加上"載入更多"的按鈕
時間 2016-01-08 Fri. 04:27:44
參考建立 ListView 的這篇 http://disp.cc/b/11-96BO
再新增一個看板列表的頁
其中 Activity 的類別名稱為 BoardListActivity.java
Adapter 的類別名稱為 BoardListAdapter.java
看板列表的API網址為 http://disp.cc/api/board.php?act=blist
因為看板非常多個,不能一次全部載入,預設只會載入20筆
要使用 http://disp.cc/api/board.php?act=blist&pageNum=1 才會載入第2頁(21~40筆)的看板列表
所以要在列表下方加上一個「載入更多」的按鈕
點了之後再載入下20筆
![[圖]](http://i.imgur.com/SpInu5J.png)
在 ListView 下方加上「載入更多」的按鈕
在 /res/layout 新增一個 row_footer.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row_footer"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_footer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:textColor="#FFF"
android:background="#000"
android:textSize="18sp"
android:gravity="center"
android:text="@string/add_more"/>
</LinearLayout>
將最外層的<LinearLayout>加上id名稱為 row_footer<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row_footer"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text_footer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:textColor="#FFF"
android:background="#000"
android:textSize="18sp"
android:gravity="center"
android:text="@string/add_more"/>
</LinearLayout>
在 strings.xml 加上
<string name="add_more">載入更多</string>
修改 BoardListActivity.java
在取得 listView 之後,也就是在 onCreate 裡的
mListView = (ListView) findViewById(R.id.boardlist_listview); 這行之後加上
//add listview footer
View footerView = getLayoutInflater().inflate(R.layout.row_footer, mListView, false);
mListView.addFooterView(footerView);
footerView.setOnClickListener(this);
利用id名稱 row_footer 將剛剛建立的layout加進 ListView 的 footerView footerView = getLayoutInflater().inflate(R.layout.row_footer, mListView, false);
mListView.addFooterView(footerView);
footerView.setOnClickListener(this);
注意 addFooterView 要在 setAdapter 之前執行才行
將「載入更多」鈕加上點擊事件
使用 footerView.setOnClickListener(this); 綁定點擊事件
若 this 被畫紅線的話,對 this 按 alt+Enter
選「Make 'BoardListActivity' implement 'android.view.View.OnClickListener'」
接著會自動新增成員函式 onClick
修改成員函式 onClick 為
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.row_footer: //點擊的是listView的footer
Log.d("BoardList","footer click");
break;
}
}
若之前已新增過 onClick 的話,就在 switch 裡加上 case R.id.row_footer: 那段即可public void onClick(View v) {
switch(v.getId()){
case R.id.row_footer: //點擊的是listView的footer
Log.d("BoardList","footer click");
break;
}
}
先執行看看,點擊列表下方的「載入更多」,在logcat有沒有顯示"footer click"
沒問題的話再來實際加上資料
修改 BoardListAdapter.java 的成員函式 updateData 為
// 輸入JSON資料
public void updateData(JSONArray jsonArray, int pageNum) throws JSONException {
if(pageNum==0) {
mJsonArray = jsonArray;
}else{
for(int i=0; i<jsonArray.length(); i++){
mJsonArray.put(jsonArray.get(i));
}
}
notifyDataSetChanged();
}
加上了第二個參數 pageNum,代表這次是載入第幾頁public void updateData(JSONArray jsonArray, int pageNum) throws JSONException {
if(pageNum==0) {
mJsonArray = jsonArray;
}else{
for(int i=0; i<jsonArray.length(); i++){
mJsonArray.put(jsonArray.get(i));
}
}
notifyDataSetChanged();
}
如果是0的話,就直接把傳入的 jsonArray 覆蓋成員變數 mJsonArray
不是的話,要用迴圈把新的資料一筆一筆加進已經有值的成員變數 mJsonArray
因為用到了 JSONArray.put(),容易出現錯誤,編輯器會要求加上 JSONException
所以在函式定義的地方要加上 throws JSONException
修改 BoardListActivity.java
加上一個成員變數 mPageNum 用來記錄這個頁面已載入到第幾頁了
在成員函式 onCreate 裡,loadData();這行之前,加上
mPageNum = 0;
先將預設值設為0修改成員函式 loadData
在 String urlString = "http://disp.cc/api/board.php?act=blist"; 這行下面加上
if(mPageNum!=0){ urlString += "&pageNum=" + mPageNum; }
在 client.get 的 onSuccess 裡
將 mAdapter.updateData(data.optJSONArray("blist")); 改成
try {
mAdapter.updateData(data.optJSONArray("blist"),mPageNum);
} catch (JSONException e) {
e.printStackTrace();
}
mPageNum++;
因為 mAdapter.updateData() 有加上 throws JSONExceptionmAdapter.updateData(data.optJSONArray("blist"),mPageNum);
} catch (JSONException e) {
e.printStackTrace();
}
mPageNum++;
所以編輯器會要求要用 try catch 包起來以接收例外情形
在 mAdapter.updateData() 的第2個參數傳入 mPageNum
接著將 mPageNum++
這樣下一次呼叫 loadData 就會載入下一頁了
修改成員函式 onRefresh
在 loadData(); 前加上
mPageNum = 0;
因為修改了 loadData 為每次呼叫時就載入新的一頁所以如果是要重整資料的話,要先將 mPageNum 設為0
--
※ 作者: Knuckles 時間: 2016-01-08 04:27:44
※ 編輯: Knuckles 時間: 2017-01-11 09:27:17
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 628
回列表(←)
分享