"У меня проблемы с пониманием, почему мой список рецептов не работает. Я пытаюсь использовать 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
Использование API в фрагменте ⇐ Android
Форум для тех, кто программирует под Android
1745515790
Anonymous
"У меня проблемы с пониманием, почему мой список рецептов не работает. Я пытаюсь использовать Spoonacular API для отображения списка рецептов, но я не получаю никаких данных от API. https://github.com/tasmiya92/recipesapplication/blob/master/app/src/main/java/com/tasmiya/recipesapplication/mainactivity.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]
`
Подробнее здесь: [url]https://stackoverflow.com/questions/79591176/using-a-api-within-a-fragment[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия