Использование API в фрагментеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Использование API в фрагменте

Сообщение Anonymous »

"У меня проблемы с пониманием, почему мой список рецептов не работает. Я пытаюсь использовать Spoonacular API для отображения списка рецептов, но я не получаю никаких данных от API. https://github.com/tasmiya92/recipesapp ... ctivity.kt. Однако в этом примере пользователь Tasmiya использовал активность, чтобы справиться с логикой API. Рецептфрагмент. https://github.com/jmv203/smartfreezer.git.[code]`class RecipesFragment : Fragment(R.layout.fragment_recipes) {

private lateinit var binding: FragmentRecipesBinding
private lateinit var recipesViewModel: RecipesViewModel
private val recipesAdapter by lazy { RecipesAdapter() }

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

binding = FragmentRecipesBinding.bind(view)

// Crea una instancia de tu ViewModelFactory
val factory = RecipesViewModelFactory(requireActivity().application, foodRecipesApi)
recipesViewModel = ViewModelProvider(this,factory).get(RecipesViewModel::class.java)

// Setup RecyclerView
setupRecyclerView()

// Load recipes from the API
loadRecipes()
}

private fun setupRecyclerView() {
binding.recipesRecyclerView.apply {
layoutManager = LinearLayoutManager(context)
adapter = recipesAdapter
}
}

private fun loadRecipes() {
recipesViewModel.getRecipes(recipesViewModel.applyQueries()) // Obtén las recetas desde la API
recipesViewModel.recipesResponse.observe(viewLifecycleOwner, { response ->
when(response) {
is NetworkResult.Success -> {
binding.shimmerLayout.stopShimmer()
binding.shimmerLayout.visibility = View.GONE
response.data?.let { recipesAdapter.setData(response.data) }
}
is NetworkResult.Error -> {
binding.shimmerLayout.stopShimmer()
binding.shimmerLayout.visibility = View.GONE
// Maneja el error, muestra un mensaje o lo que sea necesario
}
is NetworkResult.Loading -> {
binding.shimmerLayout.startShimmer()
binding.shimmerLayout.visibility = View.VISIBLE
}
}
})
}` `package com.example.smartfreezer.viewmodels

import android.app.Application
import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.example.smartfreezer.api.FoodRecipesApi
import com.example.smartfreezer.models.FoodRecipe
import com.example.smartfreezer.models.Result
import com.example.smartfreezer.util.NetworkResult
import com.example.smartfreezer.util.Constants.Companion.API_KEY
import com.example.smartfreezer.util.Constants.Companion.QUERY_ADD_RECIPE_INFORMATION
import com.example.smartfreezer.util.Constants.Companion.QUERY_API_KEY
import com.example.smartfreezer.util.Constants.Companion.QUERY_DIET
import com.example.smartfreezer.util.Constants.Companion.QUERY_FILL_INGREDIENTS
import com.example.smartfreezer.util.Constants.Companion.QUERY_NUMBER
import com.example.smartfreezer.util.Constants.Companion.QUERY_TYPE
import kotlinx.coroutines.launch
import retrofit2.Response

class RecipesViewModel(
private val foodRecipesApi: FoodRecipesApi,
application: Application
) : AndroidViewModel(application) {

private val _recipesResponse = MutableLiveData()
val recipesResponse: LiveData get() = _recipesResponse

// Llamada a la API para obtener las recetas
fun getRecipes(queries: Map) {
_recipesResponse.value = NetworkResult.Loading()

viewModelScope.launch {
if (hasInternetConnection()) {
try {
val response = foodRecipesApi.getRecipes(queries)
_recipesResponse.value = handleResponse(response)
} catch (e: Exception) {
_recipesResponse.value = NetworkResult.Error("Error: ${e.message}")
}
} else {
_recipesResponse.value = NetworkResult.Error("No Internet Connection")
}
}
}

// Manejo de la respuesta de la API
private fun handleResponse(response: Response): NetworkResult {
return if (response.isSuccessful) {
val data = response.body()?.results
if (data != null && data.isNotEmpty()) {
NetworkResult.Success(data)
} else {
NetworkResult.Error("Error: No data found")
}
} else {
NetworkResult.Error("Error: ${response.message()}")
}
}

// Verifica si hay conexión a Internet
private fun hasInternetConnection(): Boolean {
val connectivityManager = getApplication().getSystemService(
Context.CONNECTIVITY_SERVICE
) as ConnectivityManager
val activeNetwork = connectivityManager.activeNetwork ?: return false
val capabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)
}

// Prepara las consultas para la API
fun applyQueries(): HashMap {
val queries = HashMap()
queries[QUERY_NUMBER] = "50"
queries[QUERY_API_KEY] = API_KEY
queries[QUERY_TYPE] = "main course" // Ajusta el tipo de receta aquí si es necesario
queries[QUERY_DIET] = "vegan" // Ajusta el tipo de dieta si es necesario
queries[QUERY_ADD_RECIPE_INFORMATION] = "true"
queries[QUERY_FILL_INGREDIENTS] = "true"
return queries
}
}
[/code]
`

Подробнее здесь: https://stackoverflow.com/questions/795 ... a-fragment
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»