0

我想在我的應用程序中爲所有RecyclerView.Adapter使用公共擴展函數,所以我創建了一個叫做notifyAdapter的ext樂趣,但它不像預期的那樣工作。RecyclerView.Adapter的泛型Android

fun <T> RecyclerView.Adapter<RecyclerView.ViewHolder>.notifyAdapter() { 
    updateAll() 
    notifyDataSetChanged() 
} 

當我使用

offlineListAdapter.notifyAdapter()onlineListAdapter.notifyAdapter()

它拋出

不能被應用到接收器OfflineListAdapter

OfflineListAdapter.kt

class OfflineListAdapter : RecyclerView.Adapter<OfflineListAdapter.OfflineListHolder>() { 

     class OfflineListHolder(view: View) : RecyclerView.ViewHolder(view) { 

     } 
    } 

如何使用泛型爲所有RecyclerView.Adapter創建公共擴展功能。

在此先感謝。

回答

1

有幾種方法可以做到這一點。

  1. 可以標記ViewHolder參數與out差異。這種方式你的功能不是通用的,所以你不能訪問其中的確切類型ViewHolder

    fun RecyclerView.Adapter<out RecyclerView.ViewHolder>.notifyAdapter() { ... } 
    
  2. 或者,你可以有一個綁定到是ViewHolder一個子類功能的泛型類型參數。這樣,您可以在功能中使用T,例如,如果您願意,可以創建listOf<T>()

    fun <T : RecyclerView.ViewHolder> RecyclerView.Adapter<T>.notifyAdapter() { ... } 
    
  3. 最後,你也可以利用明星的投影,我認爲在這種情況下,會給你完全相同的結果作爲第一個解決方案,因爲Adapter類的類型參數有一個上限的ViewHolder

    fun RecyclerView.Adapter<*>.notifyAdapter() { ... } 
    

您可以閱讀有關方差和預測的官方文檔here的更多細節。