Actualmente no hay una implementación predeterminada de RecyclerView.Adapter disponible.
Puede ser con el lanzamiento oficial, Google lo agregará.
Puesto que no hay soporte para CursorAdapter
la RecyclerView
actualidad, ¿cómo podemos usar una RecyclerView
con una base de datos? Alguna sugerencia ?
android
simplecursoradapter
android-recyclerview
Cachorro perdido
fuente
fuente
setHasStableIds(true)
Mi solución fue mantener un miembro de CursorAdapter en mi implementación de recyclerView.Adapter. Luego, pasa todo el manejo de crear la nueva vista y vincularlo al adaptador del cursor, algo como esto:
fuente
public void changeCursor(Cursor cursor){ mCursorAdapter.changeCursor(cursor); notifyDataSetChanged(); }
Como su pregunta dice "Cómo usar
RecyclerView
con una base de datos" y no está siendo específico si desea SQLite o cualquier otra cosa con elRecyclerView
, le daré una solución que es muy óptima. Usaré Realm como base de datos y te dejaré mostrar todos los datos dentro de tuRecyclerView
. También tiene soporte para consultas asíncronas sin usarLoaders
oAsyncTask
.¿Por qué reino?
Paso 1
Agregue la dependencia de Gradle para Realm, la dependencia para la última versión se encuentra aquí
Paso 2
Cree su clase de modelo, por ejemplo, digamos algo simple como
Data
que tiene 2 campos, una cadena que se mostrará dentro de laRecyclerView
fila y una marca de tiempo que se utilizará como itemId para permitirRecyclerView
animar los elementos. Tenga en cuenta que extiendo aRealmObject
continuación debido a que suData
clase se almacenará como una tabla y todas sus propiedades se almacenarán como columnas de esa tablaData
. He marcado el texto de datos como clave principal en mi caso, ya que no quiero que se agregue una cadena más de una vez. Pero si prefiere tener duplicados, haga la marca de tiempo como @PrimaryKey. Puede tener una tabla sin una clave principal, pero causará problemas si intenta actualizar la fila después de crearla. Realm no admite una clave principal compuesta al momento de escribir esta respuesta.Paso 3
Cree su diseño de cómo debe aparecer una sola fila dentro del
RecyclerView
. El diseño para un elemento de una sola fila dentro de nuestroAdapter
es el siguienteTenga en cuenta que he mantenido una
FrameLayout
raíz como aunque tengo unTextView
interior. Planeo agregar más elementos en este diseño y, por lo tanto, lo hice flexible por ahora :)Para las personas curiosas, así es como se ve un solo elemento actualmente.
Paso 4
Crea tu
RecyclerView.Adapter
implementación. En este caso, el objeto de origen de datos es un objeto especial llamadoRealmResults
que es básicamente un LIVEArrayList
, en otras palabras, a medida que los elementos se agregan o eliminan de su tabla, esteRealmResults
objeto se actualiza automáticamente.Tenga en cuenta que estoy llamando
notifyItemRemoved
con la posición en la que ocurrió la eliminación, pero NO llamonotifyItemInserted
onotifyItemRangeChanged
porque no hay una forma directa de saber en qué posición se insertó el elemento en la base de datos, ya que las entradas del Reino no se almacenan de manera ordenada. ElRealmResults
objeto se actualiza automáticamente cada vez que se agrega, modifica o elimina un nuevo elemento de la base de datos, por lo que llamamosnotifyDataSetChanged
al agregar e insertar entradas masivas. En este punto, probablemente esté preocupado por las animaciones que no se activarán porque está llamandonotifyDataSetChanged
en lugar denotifyXXX
métodos. Esa es exactamente la razón por la que elgetItemId
método devuelve la marca de tiempo para cada fila del objeto de resultados. La animación se logra en 2 pasos connotifyDataSetChanged
si llamasetHasStableIds(true)
y luego anulagetItemId
para proporcionar algo más que solo el puesto.Paso 5
Vamos a agregar el
RecyclerView
a nuestroActivity
oFragment
. En mi caso, estoy usando unActivity
. El archivo de diseño que contieneRecyclerView
es bastante trivial y se vería así.He agregado una
app:layout_behavior
desde mi entradaRecyclerView
dentro de laCoordinatorLayout
cual no he publicado en esta respuesta por brevedad.Paso 6
Construya el
RecyclerView
código de entrada y proporcione los datos que necesita. Cree e inicialice un objeto Realm dentroonCreate
y ciérrelo dentro deonDestroy
manera similar a cerrar unaSQLiteOpenHelper
instancia. Como mínimo, suonCreate
interiorActivity
se verá así. ElinitUi
método es donde sucede toda la magia. Abro una instancia de Realm dentroonCreate
.Tenga en cuenta que en el primer paso, le pido a Realm que me dé todos los objetos de la
Data
clase ordenados por su nombre de variable llamado datos de manera asíncrona. Esto me da unRealmResults
objeto con 0 elementos en el hilo principal que estoy configurando en elAdapter
. Agregué unaRealmChangeListener
para recibir una notificación cuando los datos hayan terminado de cargarse desde el hilo de fondo donde llamonotifyDataSetChanged
con miAdapter
. También he llamadosetHasStableIds
a true para permitir que laRecyclerView.Adapter
implementación realice un seguimiento de los elementos que se agregan, eliminan o modifican. ElonDestroy
para miActivity
cierra la instancia de RealmEste método
initUi
se puede llamar dentroonCreate
de suActivity
o deonCreateView
oonViewCreated
de suFragment
. Observe las siguientes cosas.Paso 7
BAM! Hay datos de la base de datos dentro de su
RecyclerView
asynchonously cargado sinCursorLoader
,CursorAdapter
,SQLiteOpenHelper
con animaciones. La imagen GIF que se muestra aquí es un poco lenta, pero las animaciones ocurren cuando agrega elementos o los elimina.fuente
Puede implementar todos los métodos necesarios usted mismo. Recientemente hice mi propia implementación simplemente copiando el código de pegado de CursorAdapter.
fuente
Hice un RecyclerViewCursorAdapter usando una SortedList como back-end, extendiendo RecyclerView.Adapter
Se puede usar con SQLiteCursor y cargadores
fuente
Solo otra respuesta, ya que no me gustó la aceptada (que no tiene un uso intuitivo).
La siguiente es mi propia implementación, que es muy similar a (y parcialmente inspirada en)
SimpleCursorAdapter
:Puede modificarlo para otros usos particulares, pero con un cursor funciona igual
SimpleCursorAdapter
que, solo con aRecyclerView
.fuente
Después de recuperar datos de DB y almacenarlos en una lista, tal vez debería ser algo como esto:
agregar datos a la vista de reciclaje
fuente
A continuación se muestra mi implementación de cursoradapter para una vista de reciclador. Es compatible con OnItemClickListener, OnLongItemClickListener, OnfooterClickListener, Secciones y pie de página. No admite , encabezado, onHeaderClickListner, desplazamiento rápido, encabezado fijo o secciones fijas.
Simplemente extienda este adaptador y cree su propio adaptador. Anular los métodos proporcionados. y pase el cursor desde el método OnCursorLoadFinished. si el adaptador ya está creado, entonces swapCursor ()
fuente
La implementación más simple es usar el objeto cursor en el adaptador y pasar el cursor al constructor del marcador de vista para modificar vistas y cambiar la posición del cursor en onBindViewholder.
Si está utilizando el cursor Loader, llame al método setCursor
onLoadfinished()
y pase nulo enonLoadReset()
}
fuente
Finalmente tenemos una implementación de RecyclerView.Adapter para base de datos / red.
Se realizó con un Android Arquitectura Componentes :
Base de datos de sala: capa de base de datos sobre la base de datos SQLite que se encarga de las tareas mundanas que solía manejar con un
SQLiteOpenHelper
. Titular de la base de datos que sirve como punto de acceso a la base de datos SQLite subyacente. La base de datos de Room utiliza el DAO para emitir consultas a la base de datos SQLite.ViewModel: proporciona datos a la interfaz de usuario. Actúa como un centro de comunicación entre el repositorio y la interfaz de usuario. Oculta dónde se originan los datos de la interfaz de usuario. Las instancias de ViewModel sobreviven a la actividad / recreación de fragmentos.
LiveData: una clase de titular de datos que se puede observar. Siempre guarda / almacena en caché la última versión de los datos. Notifica a sus observadores cuando los datos han cambiado. LiveData es consciente del ciclo de vida. Los componentes de la interfaz de usuario solo observan datos relevantes y no detienen ni reanudan la observación. LiveData gestiona automáticamente todo esto, ya que es consciente de los cambios relevantes del estado del ciclo de vida mientras observa.
fuente
Puede usar la base de datos SQLite para almacenar los detalles. Es fácil acceder a los datos. Puedes consultar mi código en github. https://github.com/thiru-wta/ToDo
Métodos de base de datos:
obtener método:
fuente
Simplemente tiene que seguir estos pasos:
view.adapter
, cree una ArrayList o un Iterator inicializado con un valor nulo.swapdata(Arraylist<T> data)
. En el interior, le da nuevos valores a la lista de matrices, al iterador o a cualquier estructura que el sistema pueda iterar utilizando la posición de entero en bindview. Los valores de este método se pasan en elonloaderfinished()
. Luego llame justo después de la asignaciónnotifydatachange()
; estos le pedirán que vuelvaRecyclerView
a dibujar toda la lista con nuevos datos de ArrayList.En la actividad o fragmento en el que está utilizando el cargador de respaldo, cree un método que transforme el cursor en una lista de arrays o iterador, según la estructura de datos elegida en el adaptador.
De esta manera, siempre puede usar el cargador de respaldo sin bloquear el hilo principal.
fuente