亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 listView/recyclerView 對不同行進行不同布局(顯示圖像或文本)

使用 listView/recyclerView 對不同行進行不同布局(顯示圖像或文本)

喵喔喔 2021-10-28 14:06:13
您好,我是 android 開發的新手,目前正在開發我的第一個應用程序。假設現在我從上一個活動中獲得了一些數據——四個字符串數組列表——藥物名稱、圖像的 URL 鏈接、顏色、形狀。我想在格式中顯示這些信息,如下所示:四列來自四個數組列表中的項目。藥物的數量取決于 arrayLists 的大小,我想向下滾動以查看每種藥物。我在想也許可以使用 recyclerView 來實現這一點。有兩個問題:如何自定義每一行以讓僅一行顯示圖像而其他行顯示文本?我在網上查找,似乎客戶適配器以相同的布局自定義每一行。如果每次運行應用程序時藥物數量 n 不同,如何在 .xml 文件中編寫布局,因為它取決于上次活動的結果?我不能簡單地在 .xml 文件中寫入固定數量的 ListView。有人能給我一些建議嗎?非常感謝!
查看完整描述

3 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

您需要為正在使用的項目定義視圖類型。


data class MedicineItem(val name, val imageUrl, val viewType)

然后將列表傳遞到您的適配器


覆蓋適配器中的 getViewItemType() 方法。作為設計,我認為您需要三種類型的醫學項目視圖。第一個是標題,第二個是普通項目,第三個是帶有圖像的藥物項目。


你可以自己定義viewType的值,比如我剛做的


class Constants {

  const val TITLE = 1

  const val NORMAL_ITEM = 2

  const val IMAGE_ITEM = 3

}


 override fun getItemViewType(position: Int): Int {

    val item : MedicineItem = list[position]

    if(item.viewType == Constants.TITLE) 

       return Constants.TITLE

    else if(item.viewType == Constant.NORMAL_ITEM)

       return Constants.NORMAL_ITEM

    else if(item.viewType == Constant.NORMAL_ITEM)

       return Constants.IMAGE_ITEM

}

對于每個視圖項的不同布局,您需要為每種類型創建三個布局(xml 文件)和三個 ViewHolder 類。然后定義將顯示的布局。


首先,在 onCreatViewHolder() 中,決定每個視圖項將使用哪個 ViewHolder。可以看到viewType的返回值。


 override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {

    if(viewType == Constants.TITLE) {

        return MedicineTitleViewHolder()


    } else if(viewType == Constants.NORMAL_ITEM) {

        return MedicineNormalViewHolder()


    } else if(viewType == Constants.IMAGE_ITEM) {

        return MedicineIamgeViewHolder()


    }


}

最后,現在在onBindViewHolder()中返回每個item的viewholder進行回收,可以看到bind()方法接收到單個數據,可以傳遞一個MedicinItem數據對象進行顯示。


override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {

    if (holder is MedicineTitleViewHolder) {

        (holder as MedicineTitleViewHolder).bind(list[position])


    } else if(holder as MedicineNormalViewHolder){

        (holder as MedicineNormalViewHolder).bind(list[position])


    } else if(viewType == Constants.IMAGE_ITEM) {

        (holder as MedicineIamgeViewHolder).bind(list[position]) 


    }

}


查看完整回答
反對 回復 2021-10-28
?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

我認為您需要在回收站視圖中創建一個回收站視圖。您只需要創建包含 Medicine No 和另一個回收者視圖的父回收者視圖的項目布局文件。然后,您需要為包含可變數量藥物的內部回收站視圖創建項目布局文件。這回答了您的第 2 部分。



查看完整回答
反對 回復 2021-10-28
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

RecyclerView::Adapter 有一個方法 getItemViewType(position),你可以覆蓋它并返回不同的視圖類型。在 createViewHolder(viewType) 中,您可以根據視圖類型創建不同的視圖。


查看完整回答
反對 回復 2021-10-28
  • 3 回答
  • 0 關注
  • 244 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號