簡體   English   中英

在Kotlin中顯式強制轉換Android的RecyclerView的ViewHolder時出錯:“此強制轉換永遠不會成功”

[英]Error while explicitly casting Android's RecyclerView's ViewHolder in Kotlin: 'This cast can never succeed'

在Android中,我正在使用一個庫來RecyclerView實現。 我還希望,一旦開發者已經加入這個庫作為一個依賴app build.gradle ,加入RecyclerView在依賴app build.gradle不應要求。 這個庫基本上就像RecyclerView上的包裝器。

我通過在庫中動態擴展RecyclerView來處理視圖部分。 對於LayoutManager ,我創建了一個基於Factory Design Pattern的類,開發人員可以在其中選擇他想要的LayoutManager和配置。 但是在實現AdapterViewHolder包裝器類時遇到了一個問題。

嘗試#1

open class ViewHolder(view: View) : RecyclerView.ViewHolder(view)

錯誤:缺少超級類型依賴項(這意味着RecyclerView依賴項需要存在於app build.gradle

嘗試#2

class ViewHolder(view: View)

並且無論我在庫中內部使用它的什么地方,我都嘗試將它顯式地作為viewHolder as ViewHolder或將adapter as RecyclerView.Adapter viewHolder as ViewHolder adapter as RecyclerView.Adapter

錯誤:此強制轉換永遠不會成功。

請為此指導我,如何在RecyclerView上實現100%包裝?

您的庫可能依賴於RecyclerView庫,其中包含以下行:

implementation "com.android.support:recyclerview-v7:$version"

通過使用實現,不會將此依賴項暴露給依賴於庫的模塊。 因此,您的ViewHolder類的用戶將不了解RecyclerView.ViewHolder類,它會導致所描述的錯誤。

嘗試使用api在模塊鏈上傳播這種依賴關系:

api "com.android.support:recyclerview-v7:$version"

此處此處了解差異。


更新 :您可以創建包裝器類並使用內部可見性隱藏屬性:

open class ViewHolder(view: View) {
    internal val recyclerHolder = RecyclerView.ViewHolder(view)
}

這與解決方案2類似,但是您可以使用屬性而不是強制轉換為RecyclerView.ViewHolder。

嘗試這種方式進入make viewholder類。

class ItemViewHolder : RecyclerView.ViewHolder {
 constructor(itemView: View) : super(itemView){}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM