¿Puedo usar Livedata para crear datos para un PAGEKEYEDDATASOURCE? -- android campo con kotlin campo con android-jetpack campo con android-paging-library camp Relacionados El problema

Can I use Livedata to create data for a PageKeyedDataSource?


0
vote

problema

Español

Tengo una característica que requiere datos paginados. Para esto, estoy tratando de usar la Biblioteca de Paging Jetpack.

IVE CONFIGURACIÓN PageKeyDataSource Y en los ejemplos. Muestra los eventos de llamada de ASYNC que se ve bastante verbosa. Especialmente si tiene que hacer varias llamadas para crear la lista.

En su lugar, ya tengo un DataSource que hace varias llamadas, mapea todo esto y devuelve una Livedata de una página de artículos.

Así que estaba pensando en algo así como el código a continuación, pero supongo que necesitaría un observador en la fuente de datos para que la LISTA se pase al onResult

(siendo GETOMECARS la LIVEDIA)

      override fun loadInitial(params: LoadInitialParams<String>, callback: LoadInitialCallback<String, Cars>) {          callback.onResult(carsDataService.getSomeCars.value!!,null,"dsd")         TODO("not implemented")     }      override fun loadAfter(params: LoadParams<String>, callback: LoadCallback<String, Cars>) {         TODO("not implemented")     }      override fun loadBefore(params: LoadParams<String>, callback: LoadCallback<String, Cars>) {} }   

¿Alguna idea?

Original en ingles

I have a feature that requires paged data. For this I am trying to use the JetPack Paging library.

Ive set up PageKeyDataSource and in the examples it shows the async call events which looks quite verbose. Especially if you have to do multiple calls to create the list.

Instead I already have a datasource that makes multiple calls, maps all this and returns a livedata of a page of items.

So I was thinking something like the code below, but I guess it would need to an observer in the DataSource for the list to be passed to the onResult

(getsomeCars being the liveData)

    override fun loadInitial(params: LoadInitialParams<String>, callback: LoadInitialCallback<String, Cars>) {          callback.onResult(carsDataService.getSomeCars.value!!,null,"dsd")         TODO("not implemented")     }      override fun loadAfter(params: LoadParams<String>, callback: LoadCallback<String, Cars>) {         TODO("not implemented")     }      override fun loadBefore(params: LoadParams<String>, callback: LoadCallback<String, Cars>) {} } 

Any ideas?

           

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Agregar un método de conveniencia observeOnce a su clase de PagedKeyedDataSource que escucha la única actualización de una primera actualización a un objeto LiveData1 .

  fun <T> LiveData<T>.observeOnce(observer: Observer<T>) {          observeForever(object : Observer<T> {             override fun onChanged(t: T?) {                 observer.onChanged(t)                 removeObserver(this)             }         })      }   

en el archivo de su nivel de aplicación Build.Grade. Añadir esto

  implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'   

Luego, llame al objeto observeOnce4 observeOnce , que solo observa la primera actualización de su objeto , llame a la devolución de llamada.onsuccess .

  GlobalScope.launch(Dispatchers.Main) {     val observer = Observer<List<Cars>>{         callback.onResult(it, null, "dsd")     }     yourLiveDataObj.observeOnce<List<Cars>>(observer) }    

editar

En lugar de usar Livedata, puede interactuar también para lograr el mismo propósito. Declarar una interfaz genérica

  interface ApiCallback<T>{      fun onSuccess(result: T)      fun onFailure(errMsg:String)  }   

en su PageKeyDataSource

  getSomeCars(object : ApiCallback<List<Cars>>{             override fun onSuccess(result: List<Cars>) {                     callback.onResult(result, null, "dsd")             }              override fun onFailure(errMsg: String) {                  Log.w("get some cars failed with err: $errMsg")             }         })   

en LiveData0 FUNCIÓN

  LiveData111  
 

Add a convenience method observeOnce to your PagedKeyedDataSource class which listens for the only first update to a LiveData object.

fun <T> LiveData<T>.observeOnce(observer: Observer<T>) {          observeForever(object : Observer<T> {             override fun onChanged(t: T?) {                 observer.onChanged(t)                 removeObserver(this)             }         })      } 

In your app level build.gradle file. Add this

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1' 

Then call the observeOnce method on your LiveData object, which only observes the first update from your LiveData object, then calls callback.onSuccess.

GlobalScope.launch(Dispatchers.Main) {     val observer = Observer<List<Cars>>{         callback.onResult(it, null, "dsd")     }     yourLiveDataObj.observeOnce<List<Cars>>(observer) }  

EDIT

Instead of using LiveData you can interfaces to also achieve the same purpose. Declare a generic interface

interface ApiCallback<T>{      fun onSuccess(result: T)      fun onFailure(errMsg:String)  } 

In your PagedKeyDataSource

getSomeCars(object : ApiCallback<List<Cars>>{             override fun onSuccess(result: List<Cars>) {                     callback.onResult(result, null, "dsd")             }              override fun onFailure(errMsg: String) {                  Log.w("get some cars failed with err: $errMsg")             }         }) 

In getSomeCars() function

fun getSomeCars(apiCallback:ApiCallback<List<Cars>>){     //after your multiple api calls call     apiCallback.onSuccess(carListResults) }  
 
 
         
         

Relacionados problema

0  ¿Cómo implementar la biblioteca de paginación con Reino en Android?  ( How to implement paging library with realm in android ) 
¿Hay alguna mejor manera de implementar la biblioteca de paginación con el reino en Android? Encontré la envoltura de la monarquía, pero ¿hay algo mejor? ...

4  JetPack Paging3 Library hace varias llamadas a la misma página  ( Jetpack paging3 library makes several calls to the same page ) 
Estoy tratando de implementar la biblioteca de jetpack Paging 3 siguiendo la codelab utilizando la base de datos de la habitación como fuente de verdad y un...

3  No se puede recopilar ningún flujo después de emitir flujo de Paging3  ( Can not collect any flow after emitting paging3 flow ) 
Estoy usando paging3 y tengo dos fuentes de paginación diferentes. El problema es Coroutine Scope solo emite First Paging Flow En ViewModel Tengo dos ...

5  Cómo borrar / eliminar todos los elementos en el adaptador de la lista de páginas  ( How to clear remove all items in page list adapter ) 
Estoy usando la Biblioteca de Paging Android para mostrar los elementos de resultados de la búsqueda, ¿hay alguna forma en que puedo borrar / eliminar todos l...

13  ¿Cómo puedo probar la paginación 3 (PagingSource)?  ( How can i unit test paging 3pagingsource ) 
Google anunció recientemente la nueva biblioteca de Paging 3, Kotlin-First Library, Soporte para Coroutines y Flujo ... etc. Jugui con el CODELAB que prop...

3  Actualización de un solo artículo en un recylerview. Estoy usando la biblioteca de paginación y me gustaría actualizar un solo artículo / fila  ( Updating a single item in a recylerview i am using paging library and would lik ) 
Estoy pasando los valores de Pagedlist al adaptador utilizando la lista de envíos. Cuando actualizo un solo artículo, considere que estoy haciendo clic en un ...

1  Cómo eliminar el artículo de Pagedlist  ( How to remove item from pagedlist ) 
Hola, estoy usando la biblioteca MVVM y Paging. La paginación funciona perfectamente. Quiero eliminar el artículo de la lista. Cuando intento eliminar el ...

2  Paginación 3 Carga inicial no mostrada  ( Paging 3 initial loading not shown ) 
Estoy trabajando con la paginación 3, todo funciona bien, excepto el estado de carga inicial. Estoy agregando withLoadStateFooter , pero nunca muestra la car...

0  Biblioteca de depósito de depuración de componentes de arquitectura  ( Debug paging library from architecture components ) 
¿Hay alguna forma de ayudar a depurar paginación de la biblioteca de los componentes de la arquitectura con las solicitudes de red, como si hubiera algún er...

0  Reciclaje de reciclaje con tipos de vistas múltiples y biblioteca de paginación con devolución de llamada de límite  ( Recyclerview with multiple view types and paging library with boundary callback ) 
Tengo un proyecto en el que quiero mostrar varios artículos (imagen, texto, video, etc.) al usuario. Soy consciente de cómo funcionan los tipos de vistas múlt...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos