Implement showing recipe pictures in the list

This commit is contained in:
Kirill Kamakin
2021-11-08 21:09:55 +03:00
parent 67b75b710d
commit 407a73d444
10 changed files with 64 additions and 12 deletions

View File

@@ -0,0 +1,15 @@
package gq.kirmanak.mealie.ui
import android.widget.ImageView
import androidx.annotation.DrawableRes
import com.bumptech.glide.Glide
import javax.inject.Inject
class ImageLoader @Inject constructor() {
fun loadImage(url: String?, @DrawableRes placeholderId: Int, imageView: ImageView) {
with(Glide.with(imageView)) {
if (url.isNullOrBlank()) clear(imageView)
else load(url).placeholder(placeholderId).into(imageView)
}
}
}

View File

@@ -1,18 +1,30 @@
package gq.kirmanak.mealie.ui.recipes
import android.widget.ImageView
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.Pager
import androidx.paging.PagingData
import androidx.paging.cachedIn
import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealie.data.recipes.RecipeImageLoader
import gq.kirmanak.mealie.data.recipes.RecipeRepo
import gq.kirmanak.mealie.data.recipes.db.RecipeEntity
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class RecipeViewModel @Inject constructor(private val recipeRepo: RecipeRepo) : ViewModel() {
class RecipeViewModel @Inject constructor(
private val recipeRepo: RecipeRepo,
private val recipeImageLoader: RecipeImageLoader
) : ViewModel() {
private val pager: Pager<Int, RecipeEntity> by lazy { recipeRepo.createPager() }
val recipeFlow: Flow<PagingData<RecipeEntity>> by lazy { pager.flow.cachedIn(viewModelScope) }
fun loadRecipeImage(view: ImageView, recipe: RecipeEntity?) {
viewModelScope.launch {
recipeImageLoader.loadRecipeImage(view, recipe?.slug)
}
}
}

View File

@@ -31,7 +31,7 @@ class RecipesFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.recipes.layoutManager = LinearLayoutManager(requireContext())
val recipesPagingAdapter = RecipesPagingAdapter()
val recipesPagingAdapter = RecipesPagingAdapter(viewModel)
binding.recipes.adapter = recipesPagingAdapter
lifecycleScope.launchWhenResumed {
viewModel.recipeFlow.collectLatest {

View File

@@ -9,7 +9,9 @@ import gq.kirmanak.mealie.data.recipes.db.RecipeEntity
import gq.kirmanak.mealie.databinding.ViewHolderRecipeBinding
import timber.log.Timber
class RecipesPagingAdapter : PagingDataAdapter<RecipeEntity, RecipeViewHolder>(RecipeDiffCallback) {
class RecipesPagingAdapter(
private val viewModel: RecipeViewModel
) : PagingDataAdapter<RecipeEntity, RecipeViewHolder>(RecipeDiffCallback) {
override fun onBindViewHolder(holder: RecipeViewHolder, position: Int) {
val item = getItem(position)
holder.bind(item)
@@ -19,14 +21,17 @@ class RecipesPagingAdapter : PagingDataAdapter<RecipeEntity, RecipeViewHolder>(R
Timber.v("onCreateViewHolder() called with: parent = $parent, viewType = $viewType")
val inflater = LayoutInflater.from(parent.context)
val binding = ViewHolderRecipeBinding.inflate(inflater, parent, false)
return RecipeViewHolder(binding)
return RecipeViewHolder(binding, viewModel)
}
}
class RecipeViewHolder(private val binding: ViewHolderRecipeBinding) :
RecyclerView.ViewHolder(binding.root) {
class RecipeViewHolder(
private val binding: ViewHolderRecipeBinding,
private val recipeViewModel: RecipeViewModel
) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: RecipeEntity?) {
binding.name.text = item?.name
recipeViewModel.loadRecipeImage(binding.image, item)
}
}