Есть приложение состоящее из двух фрагментов. Первый фрагмент - это 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'
}