Ошибка при явном приведении Android RecyclerView ViewHolder в Kotlin: «Это приведение никогда не может быть успешным» - PullRequest
0 голосов
/ 07 декабря 2018

В Android я работаю над библиотекой, чтобы упростить реализацию RecyclerView.Я также хочу, чтобы после того, как разработчик добавил эту библиотеку в качестве зависимости в app build.gradle, добавление зависимости RecyclerView в app build.gradle не требуется.Эта библиотека в основном будет похожа на оболочку RecyclerView.

. Я обработал часть представления, динамически раздувая RecyclerView в библиотеке.Для LayoutManager я создал класс на основе Factory Design Pattern, где разработчик может выбрать, какую LayoutManager и какую конфигурацию он хочет.Но я столкнулся с проблемой при реализации классов-оболочек Adapter и ViewHolder.

Попытка # 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

Ошибка: это приведение никогда не будет успешным.

Пожалуйста, объясните мне, как мне достичь 100% -ой обертки на RecyclerView

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Ваша библиотека предположительно зависит от библиотеки 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 вы используете свойство.

0 голосов
/ 07 декабря 2018

Попробуйте сделать это в классе makeholder.

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

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...