顯示廣告
隱藏 ✕
看板 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 累積人氣: 204 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇