顯示廣告
隱藏 ✕
看板 KnucklesNote
作者 Knuckles (站長 那克斯)
標題 [AndroidStudio] 列表的Adapter使用不同的layout檔
時間 2017-01-11 Wed. 12:11:06


依這篇 [AndroidStudio] 自訂Adapter用JSON資料建立ListView - KnucklesNote板 - Disp BBS
使用 Adapter 建立了 ListView 後

如果要在列表頁的 ListView 上方或下方加上不同的 layout 時
可以用 ListView 的成員函式 addHeaderView() 或 addFooterView()
參考這篇 [AndroidStudio] 在ListView下方加上"載入更多"的按鈕

如果是要在列表中的某幾列使用不同的 layout 時,像這樣
[圖]

假設固定只有兩個置頂文時
第0列和第3列的 layout 使用 row_headertitle.xml
其他列的 layout 使用 row_textlist.xml


新增 layout 檔 row_headertitle.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#555">

    <TextView android:id="@+id/header_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="16dp"
        android:textColor="#CCC"
        />

</RelativeLayout>


修改 Adapter 的 java 檔
加上兩個成員函式
    @Override
    public int getItemViewType(int position) {
        // 讓Adapter區分目前位置是用哪一個view,避免回收時用到錯誤的view
        if(position==0 || position==3){
            return 0;
        }else{
            return 1;
        }
    }

    @Override
    public int getViewTypeCount() {
        return 2; // 有用到幾種view
    }


修改成員函式 getCount() 與 getItem()
    @Override
    public int getCount() {
        return mJsonArray.length() + 4;
    }

    @Override
    public Object getItem(int position) {
        if(getItemViewType(position)==0){ //是headerTitle時不用取資料
            return null;
        }else if(position < 3){ //取出置頂文的資料
            return mBotList.optJSONObject(position-1);
        }else{ //取出最新文章的資料
            return mJsonArray.optJSONObject(position-4);
        }
    }


修改成員函式 getView()
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //在前面加上這段,將第0列和第3列使用不同的 layout
        if(getItemViewType(position)==0){
            convertView = mInflater.inflate(R.layout.row_headertitle, parent, false);
            TextView titleTextView = (TextView) convertView.findViewById(R.id.header_title);
            if(position==0) {
                titleTextView.setText("置頂文章");
            }else{
                titleTextView.setText("最新文章");
            }
            return convertView;
        }

        //... 其他列使用原本的 layout


修改 Activity 的 java 檔
修改成員函式 onItemClick()
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //前面加上這段,若是點擊了 headerTitle 時不用動作
        if(parent.getAdapter().getItemViewType(position)==0){
            return;
        }

        //...

--
※ 作者: Knuckles 時間: 2017-01-11 12:11:06
※ 編輯: Knuckles 時間: 2017-02-25 03:32:06
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 205 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇
看板名稱: 確定(Enter) 取消(Esc) 搜尋(Space)
查詢帳號: 確定(Enter) 取消(Esc) 搜尋(Space)
搜尋: m)m文 b)進板 c)未分類 a)作者 /)標題 q)取消?[q]

搜尋 送出(Enter) 取消(Esc)

回覆文章至: f)看板 m)作者信箱 b)兩者皆是 q)取消?[f]
要引用原文嗎? y)引用原文 n)不引用 a)全部回覆 r)複製原文 q)取消?[y]
轉錄本文章於看板: 1)使用連結 2)使用複製 q)取消 ?[1]
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc) 全部(a)

確定要刪除這篇文章?(可按大U救回) 確定(Enter) 取消(Esc)

刪除理由:

確定(Enter) 取消(Esc)
加到這個分類: 確定(Enter) 下一層(→) 回上層(←) 取消(Esc)
你覺得這篇文章: 1)真讚 2)真瞎 q)取消?[1] (再選一次即可收回)
你覺得這篇文章: 1)值得推薦 2)表示反對 3)單純註解 q)取消?[3]
guest
預覽(Enter) 取消(Esc)
上傳圖片
按ctrl+Enter可輸入下一行。
guest
確定要送出? 確定(Enter) 取消(Esc) 繼續(e)
搜尋: 送出(Enter) 取消(Esc)

▏▎▍▌▋▊▉ 請按任意鍵繼續