Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Primer entregable #28

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

AldoCrono
Copy link

-Pantalla de lista de monedas
-Pantalla de detalle

-Pantalla de lista de monedas
-Pantalla de detalle
class AvailableBooksAdapter(
private var data: List<AvailableBook> = emptyList<AvailableBook>(),
private val goToDetail: (AvailableBook?) -> Unit,
) : RecyclerView.Adapter<AvailableBooksAdapter.ViewHolder>() {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Evita usar directamente RecyclerView.Adapter, ya que es poco eficiente. Puedes usar ListAdapter, el cual se apoya en los DiffCallbacks para mejorar la eficiencia de listas.


inner class ViewHolder(private val itemBinding: ItemOpenOrderBinding) : RecyclerView.ViewHolder(itemBinding.root) {
fun bindItem(item: OpenOrder) = with(itemBinding) {
openOrderPrice.text = item.price.toString()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Para que tu interfaz se vea más llamativa al usuario, podrías crear una función de extensión que transforme un número a un formato de moneda.

.addConverterFactory(GsonConverterFactory.create(gson))
.build()

fun repository(): BitsoApi = getRetrofit().create(BitsoApi::class.java)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Por favor cambia el nombre de este método. Un API/service, no es un repository.

@SerializedName("payload")
@Expose
var payload: List<AvailableBookDto>? = null
):Serializable

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

En este caso, no es necesario que el modelo implemente Serializable
(*Aplica también para TickerResponse y TickerDto)

bids = bids.toOrderBookList
)

private val List<OpenOrderResponse>?.toOrderBookList: List<OpenOrder>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revisa por favor las funciones de extensión, la nomenclatura es un poco distinta:
https://kotlinlang.org/docs/extensions.html#extensions-are-resolved-statically


binding.apply {
criptoCurrencyVM.isLoading.observe(viewLifecycleOwner) {
rvBooks.adapter = AvailableBooksAdapter(criptoCurrencyVM.availableOrderBookList.value ?: emptyList(),

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Un Observer se llama con cada cambio del Observable, por esta razón crear un adapter dentro de un Observer puede ser costoso para UI y puede generar memory leaks.
Evita instanciar adapters en Observers, en cambio, crea el adapter por fuera y usa un método para actualizar la lista de datos (por ejemplo, para un ListAdapter puedes usar submitList)

import kotlinx.coroutines.flow.onEach
import javax.inject.Inject

@HiltViewModel

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Al igual que @Inject, @HiltViewModel es una anotación característica del framework de inyección de dependencias. Aún no tienes implementado Hilt por completo en tu aplicación, así que en este momento, esta anotación no es necesaria.

private val orderBookUseCase: OrderBookUseCase
) : ViewModel() {

private var _availableOrderBookList = MutableLiveData<List<AvailableBook>>()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Estas variables deberían ser tipo val.

_isLoading.value = false
}
is RequestState.Error -> {
error(it.message ?: "")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar al comentario en el Fragment, el manejo de errores debe hacerse mediante observables en lugar de callbacks desde la UI.

import javax.inject.Inject

@HiltViewModel
class CriptoCurrencyViewModel @Inject constructor(

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Por convención, para cada Fragmento hay un ViewModel respectivo que se encarga de su estado.
Por favor, agrega AvailableBooksViewModel y OrderBookDetailViewModel

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants