顯示廣告
隱藏 ✕
看板 KnucklesNote
作者 Knuckles (站長 那克斯)
標題 [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筆

[圖]


在 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

在 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 的 footer

注意 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: 那段即可

先執行看看,點擊列表下方的「載入更多」,在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,代表這次是載入第幾頁
如果是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 JSONException
所以編輯器會要求要用 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 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇