Tsudzukeru
@Tsudzukeru

Почему Glide не грузит imageView?

Есть приложение состоящее из двух фрагментов. Первый фрагмент - это RecyclerView, ViewHolder которого это ImageView и текст, содержащий некоторый description. При нажатии на ViewHolder - откроется второй фрагмент где должна загрузиться ImageView во весь экран.

Раньше приложение использовало Picasso и изображения грузились в обоих фрагментах, но т.к Glide быстрее грузит изображения в RecyclerView - решил перейти на нее и это помогло. Теперь ViewHolder выглядит вот так:
inner class ImageMediaPreviewViewHolder(view: View) : RecyclerView.ViewHolder(view) {

        fun bind(mediaPreview: MediaPreview) {

            val circularProgressDrawable = CircularProgressDrawable(itemView.context)
            circularProgressDrawable.strokeWidth = 5f
            circularProgressDrawable.centerRadius = 30f
            circularProgressDrawable.setColorSchemeColors(Color.WHITE)
            circularProgressDrawable.start()

            GlideApp.with(itemView.context)
                .load(mediaPreview.previewUrl)
                .placeholder(circularProgressDrawable)
                .into(itemView.media_preview_recycler_view_image)

                itemView.setOnClickListener {
                    navController?.navigate(
                        PreviewMediaFragmentDirections.actionMediaFragmentToImageDetailFragment(
                            mediaPreview.nasaId,
                            mediaPreview.mediaType
                        )
                    )
                }

            itemView.description_text_view.text = mediaPreview.description
            itemView.date_created_text_view.text = mediaPreview.dateCreated

            }
    }


Но при замене Picasso, на Glide внутри Detail фрагмента - изображения не грузится.
Т.е вот такой код работает:

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
...
        viewModel.mediaDetails.observe(viewLifecycleOwner, { mediaDetailResponse ->
            picasso
                .load("https://images-assets.nasa.gov/image/201210220003HQ/201210220003HQ~thumb.jpg")
                .into(imageView) })
}


А следующий код уже не работает, хотя параметры одинаковые:

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
...
        viewModel.mediaDetails.observe(viewLifecycleOwner, { mediaDetailResponse ->
           Glide.with(requireContext())
                .load("https://images-assets.nasa.gov/image/201210220003HQ/201210220003HQ~thumb.jpg")
                .into(imageView)
}


В лог приходит следующее сообщение:
W/Glide: Failed to find GeneratedAppGlideModule. You should include an annotationProcessor compile dependency on com.github.bumptech.glide:compiler in your application and a @GlideModule annotated AppGlideModule implementation or LibraryGlideModules will be silently ignored

Думал, что в этом и есть причина. Нашел следующее решение:
Добавить новый класс.
@GlideModule
class AppNameGlideModule : AppGlideModule() {

    override fun applyOptions(context: Context, builder: GlideBuilder) {
        super.applyOptions(context, builder)
        builder.apply { RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL).signature(ObjectKey(System.currentTimeMillis().toShort())) }
    }

}


и грузить ImageView с его помощью.
GlideApp.with(context)
            .load(url)
            .into(imageView)


Сообщение больше не попадает в лог, но Glide всё так же не грузит ImageView в Detail фрагменте. В чем еще может быть причина?

Разбираю примеры приложений и почти по всех идет простой вызов:
Glide.with(context)
    .load(url)
    .into(imageView);

Как во ViewHolder, так и в Detail фрагменте, меняется только контекст. У меня это почему то не работает.

Вот мой build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: "androidx.navigation.safeargs"
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        applicationId "com.nasa.app"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    dataBinding {
        enabled true
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.2'
    implementation 'androidx.navigation:navigation-ui-ktx:2.3.2'

    implementation 'com.google.android.material:material:1.2.1'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    testImplementation "com.google.truth:truth:1.0.1"

    //ViewModel and LiveData
    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

    //Recyclerview
    implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha05'
    implementation 'androidx.cardview:cardview:1.0.0'

    //Retrofit
    def retrofit_version = "2.9.0"
    implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
    implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
    implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
    implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'

    // Gson
    implementation "com.google.code.gson:gson:2.8.5"

    // Paging
    implementation "androidx.paging:paging-runtime:2.1.0"

    //Rx
    implementation 'io.reactivex.rxjava2:rxjava:2.2.7'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'

    //Picasso
    implementation 'com.squareup.picasso:picasso:2.71828'

    // Glide
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

    //ExoPlayer
    implementation 'com.google.android.exoplayer:exoplayer:2.13.1'

    //FlexBoxLayout
    implementation 'com.google.android:flexbox:2.0.1'

    //Dagger
    def dagger_version = "2.33"
    implementation "com.google.dagger:dagger:$dagger_version"
    kapt "com.google.dagger:dagger-compiler:$dagger_version"

    //LeakCanary
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
}
  • Вопрос задан
  • 700 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы