Implement showing recipe pictures in the list
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user