0

私はすべてのアプリケーションに共通の拡張機能を使用しようとしていますので、notifyAdapterというext funを作成しましたが、期待通りに機能しません。Generic for RecyclerView.Adapter Android

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

私は

offlineListAdapter.notifyAdapter()またはonlineListAdapter.notifyAdapter()

を使用する場合、それは

がOfflineListAdapter.kt

をOfflineListAdapter受信機に適用することはできませんスロー

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

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

     } 
    } 

ジェネリックスを使用してRecyclerView.Adapterすべての共通拡張機能を作成するにはどうすればよいですか。

ありがとうございます。

答えて

1

これを行うにはいくつかの方法があります。

  1. あなたはout分散のViewHolderパラメータをマークすることができます。この方法では、関数が汎用ではないので、その中の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の変動と予測に関するより詳細な情報を読み込むことができます。