如何解决Android Studio Kotlin 将lifecycleScope.launchWhenCreated 从Fragment 移动到onBindViewHolder
使用 Android Studio Kotlin 我有获取 flickr 图像的工作代码。当我获取超过几页的照片(即,每页获取 100 张照片大约 1 秒)时,此代码非常慢。我的 recycleView 中有大约 4000 个项目。理想情况下,我只想在查看器图像进入视图时获取照片,并在视图通过时取消。我想我希望从 ViewHolder onBindViewHolder 运行生命周期范围.launchWhenCreated。但是当我这样做时,生命周期范围不被识别为可编译。根据我的阅读,lifecycleScope 仅在片段的范围内。
问题是,如何让代码在 viewHolder 级别运行?
这是我的 Fragment 中的代码。
private lateinit var figurePhotoListRecyclerView: RecyclerView
private val photosViewModel: PhotosViewModel by viewModels()
...
lifecycleScope.launchWhenCreated {
// list of all photos
val fullImageList = mutableListOf<FlickrPhoto>()
// if all figures,just get the primary front images
figureListForSeries.forEach { figure ->
if (figure.flickrPrimaryPhoto == null) {
val figureImageName = "${figure.figureGlobalUniqueId}_$PRIMARY_FRONT_IMAGE_TEXT"
val pageCounter = 1
val imageList: MutableList<FlickrPhoto> =
photosViewModel.fetchImagesText(
figureImageName,pageCounter.toString()
) as MutableList<FlickrPhoto>
fullImageList.addAll(imageList)
// set photo to figure contains figureId and not counterfeit
figure.flickrPrimaryPhoto =
fullImageList.firstOrNull { primaryImage ->
primaryImage.title == figureImageName
}
}
figurePhotoListRecyclerView.adapter?.notifyDataSetChanged()
}
figurePhotoListRecyclerView.adapter?.notifyDataSetChanged()
}
我想在viewHolder中运行这里的代码
override fun onBindViewHolder(holder: FigurePhotoListViewHolder,position: Int) {
// get the series for the position
val figure = figureFilterList[position]
// click listener
holder.itemView.setOnClickListener {
clickListener.figureClicked(figure)
}
// set photo
if (figure.flickrPrimaryPhoto != null) {
holder.bind(figure.flickrPrimaryPhoto!!)
}
else {
<------ run the photolookup here! ------->
holder.imageViewFigure.setImageResource(R.drawable.mytoybox_logo)
}
...
来自 https://medium.com/@yoavgray/mvvm-flickr-android-app-with-common-dev-use-cases-part-3-6586133321b6 的 Flickr 照片代码
class PhotosViewModel : ViewModel() {
private val mutablePhotosLiveData = MutableLiveData<List<FlickrPhoto>>()
val photosLiveData: LiveData<List<FlickrPhoto>> = mutablePhotosLiveData
suspend fun fetchImagesText(searchText: String,page: String): List<FlickrPhoto> {
if (searchText.isBlank()) {
return emptyList()
}
val searchResponse = WebClient.clientText.fetchImages(searchText,page)
return searchResponse.photos.photo.map { photo ->
FlickrPhoto(
id = photo.id,url = "https://farm${photo.farm}.staticflickr.com/${photo.server}/${photo.id}_${photo.secret}.jpg",title = photo.title
)
}
}
}
get 调用 https://medium.com/@yoavgray/mvvm-flickr-android-app-with-common-dev-use-cases-part-3-6586133321b6
interface FlickrAPIServiceText {
companion object {
const val FLICKR_API_KEY: String = "xxx"
const val FLICKR_USER_ID: String = "yyy"
}
@GET("?method=flickr.photos.search&format=json&nojsoncallback=1&extras=original_format&user_id=$FLICKR_USER_ID&api_key=$FLICKR_API_KEY")
suspend fun fetchImages(
@Query("text") text: String,@Query("page") page: String): PhotosSearchResponse
}
来自 https://medium.com/@yoavgray/mvvm-flickr-android-app-with-common-dev-use-cases-part-3-6586133321b6 的 Web 客户端实用程序
// Retrofit's base urls must end with a "/" or OkHttp will through an exception!
private const val BASE_URL = "https://api.flickr.com/services/rest/"
private const val CONNECTION_TIMEOUT_MS: Long = 10
object WebClient {
val clientText: FlickrAPIServiceText by lazy {
Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(
GsonConverterFactory.create(
GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
)
)
.client(
OkHttpClient.Builder().connectTimeout(
CONNECTION_TIMEOUT_MS,TimeUnit.SECONDS
).addInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BASIC
}).build()
)
.build()
.create(FlickrAPIServiceText::class.java)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。