Atualmente, não há implementação padrão do RecyclerView.Adapter disponível.
Pode ser com o lançamento oficial, o Google irá adicioná-lo.
Como não há suporte para CursorAdapter
o RecyclerView
atualmente, como podemos usar um RecyclerView
com um banco de dados? Alguma sugestão ?
android
simplecursoradapter
android-recyclerview
LostPuppy
fonte
fonte
setHasStableIds(true)
Minha solução foi manter um membro CursorAdapter na minha implementação do recyclerView.Adapter. Em seguida, passe toda a manipulação de criação da nova visualização e vincule-a ao adaptador de cursor, algo como isto:
fonte
public void changeCursor(Cursor cursor){ mCursorAdapter.changeCursor(cursor); notifyDataSetChanged(); }
Como sua pergunta diz "Como usar
RecyclerView
com um banco de dados" e você não está sendo específico, quer queira SQLite ou qualquer outra coisa com oRecyclerView
, darei a você uma solução que é altamente ideal. Vou usar o Domínio como banco de dados e permitir que você exiba todos os dados dentro do seuRecyclerView
. Também possui suporte a consultas assíncronas sem usarLoaders
ouAsyncTask
.Por que reino?
Passo 1
Adicione a dependência gradle para Realm, a dependência para a versão mais recente é encontrada aqui
Passo 2
Crie sua classe de modelo, por exemplo, digamos algo simples, como
Data
2 campos, uma sequência a ser exibida dentro daRecyclerView
linha e um carimbo de data / hora que será usado como itemId para permitir aRecyclerView
animação de itens. Observe que eu estendoRealmObject
abaixo devido ao qual suaData
classe será armazenada como uma tabela e todas as suas propriedades serão armazenadas como colunas dessa tabelaData
. Marquei o texto dos dados como chave primária no meu caso, pois não quero que uma string seja adicionada mais de uma vez. Mas se você preferir duplicatas, faça o carimbo de data e hora como @PrimaryKey. Você pode ter uma tabela sem uma chave primária, mas isso causará problemas se você tentar atualizar a linha após criá-la. Uma chave primária composta no momento da redação desta resposta não é suportada pelo Realm.etapa 3
Crie seu layout para como uma única linha deve aparecer dentro do
RecyclerView
. O layout para um item de linha única dentro de nossaAdapter
é o seguinteObserve que eu mantive a
FrameLayout
raiz como mesmo tendo umTextView
interior. Pretendo adicionar mais itens nesse layout e, portanto, o flexibilizei por enquanto :)Para as pessoas curiosas, é assim que um único item se parece atualmente.
Passo 4
Crie sua
RecyclerView.Adapter
implementação. Nesse caso, o objeto de fonte de dados é um objeto especial chamadoRealmResults
basicamente LIVEArrayList
, ou seja, quando itens são adicionados ou removidos da sua tabela, esseRealmResults
objeto é atualizado automaticamente.Observe que estou ligando
notifyItemRemoved
com a posição em que a remoção ocorreu, mas NÃO LIGOnotifyItemInserted
ounotifyItemRangeChanged
porque não há uma maneira direta de saber para qual posição o item foi inserido no banco de dados, pois as entradas de Região não são armazenadas de maneira ordenada. ORealmResults
objeto é atualizado automaticamente sempre que um novo item é adicionado, modificado ou removido do banco de dados, por isso chamamosnotifyDataSetChanged
ao adicionar e inserir entradas em massa. Neste ponto, você provavelmente está preocupado com as animações que não serão acionadas porque você está chamandonotifyDataSetChanged
no lugar denotifyXXX
métodos. É exatamente por isso que ogetItemId
método retorna o carimbo de data e hora de cada linha do objeto de resultados. A animação é alcançada em 2 etapas comnotifyDataSetChanged
se você ligarsetHasStableIds(true)
e depois substituirgetItemId
para fornecer algo diferente da posição.Etapa 5
Vamos adicionar o
RecyclerView
ao nossoActivity
ouFragment
. No meu caso, estou usando umActivity
. O arquivo de layout que contém oRecyclerView
é bastante trivial e seria algo parecido com isto.Eu adicionei um
app:layout_behavior
desde que eu entreiRecyclerView
em umCoordinatorLayout
que eu não publiquei nesta resposta por questões de brevidade.Etapa 6
Construa o
RecyclerView
código de entrada e forneça os dados necessários. Crie e inicialize um objeto Realm dentroonCreate
e feche-o dentro daonDestroy
mesma maneira que fecha umaSQLiteOpenHelper
instância. No mais simples, o seuonCreate
interiorActivity
ficará assim. OinitUi
método é onde toda a mágica acontece. Eu abro uma instância do Realm dentroonCreate
.Observe que, na primeira etapa, eu consulte o Realm para fornecer todos os objetos da
Data
classe classificados pelo nome da variável denominada data de maneira assíncrona. Isso me dá umRealmResults
objeto com 0 itens no thread principal que eu estou configurando noAdapter
. Eu adicionei umRealmChangeListener
ser notificado quando os dados têm de carregamento acabado a partir da discussão de fundo onde eu chamonotifyDataSetChanged
com a minhaAdapter
. Também chameisetHasStableIds
true para permitir que aRecyclerView.Adapter
implementação acompanhe os itens adicionados, removidos ou modificados. OonDestroy
for myActivity
fecha a instância do RealmEste método
initUi
pode ser chamado dentroonCreate
de suaActivity
ouonCreateView
ouonViewCreated
do seuFragment
. Observe o seguinte.Etapa 7
BAM! Há dados de banco de dados dentro de sua
RecyclerView
asynchonously carregado semCursorLoader
,CursorAdapter
,SQLiteOpenHelper
com animações. A imagem GIF mostrada aqui é meio que lenta, mas as animações estão acontecendo quando você adiciona itens ou os remove.fonte
Você pode implementar todos os métodos necessários. Recentemente, fiz minha própria implementação, basta copiar o código de colagem do CursorAdapter.
fonte
Criei um RecyclerViewCursorAdapter usando um SortedList como back-end, estendendo o RecyclerView.Adapter
Pode ser usado com SQLiteCursor e Loaders
fonte
Apenas mais uma resposta, já que eu não gostei da resposta aceita (que imo não tem uso intuitivo).
A seguir, minha própria implementação, que é muito semelhante a (e parcialmente inspirada por)
SimpleCursorAdapter
:Você pode modificá-lo para outros usos específicos, mas, com um cursor, ele funciona da mesma maneira
SimpleCursorAdapter
que apenas com aRecyclerView
.fonte
Após recuperar os dados do banco de dados e armazenar em uma lista, talvez seja algo como isto:
adicionar dados à reciclagem
fonte
Abaixo está minha implementação do cursoradapter para uma reciclagem. Ele suporta OnItemClickListener, OnLongItemClickListener, OnfooterClickListener, Seções e rodapé. Não suporta seções de cabeçalho, onHeaderClickListner, rolador rápido, cabeçalho ou aderência.
Apenas estenda esse adaptador e crie seu próprio adaptador. Substitua os métodos fornecidos. e passe o cursor do método OnCursorLoadFinished. Se o adaptador já estiver criado, então swapCursor ()
fonte
A implementação mais simples é usar o objeto cursor no adaptador e passar o cursor para o construtor viewholder para modificar visualizações e alterar a posição do cursor no onBindViewholder.
Se você estiver usando o cursor Loader, chame o método setCursor
onLoadfinished()
e passando nuloonLoadReset()
}
fonte
Finalmente, temos uma implementação do RecyclerView.Adapter para banco de dados / rede.
Ele percebeu com um Android Architecture Components :
Banco de dados da sala: camada de banco de dados na parte superior do banco de dados SQLite que cuida de tarefas comuns que você costumava lidar com um
SQLiteOpenHelper
. Detentor de banco de dados que serve como um ponto de acesso ao banco de dados SQLite subjacente. O banco de dados da sala usa o DAO para emitir consultas ao banco de dados SQLite.ViewModel: fornece dados para a interface do usuário. Atua como um centro de comunicação entre o Repositório e a UI. Oculta a origem dos dados da interface do usuário. As instâncias do ViewModel sobrevivem à recreação Atividade / Fragmento.
LiveData: Uma classe de suporte de dados que pode ser observada. Sempre mantém / armazena em cache a versão mais recente dos dados. Notifica seus observadores quando os dados foram alterados. O LiveData reconhece o ciclo de vida. Os componentes da interface do usuário apenas observam dados relevantes e não param ou retomam a observação. O LiveData gerencia tudo isso automaticamente, pois está ciente das mudanças relevantes no status do ciclo de vida enquanto observa.
fonte
Você pode usar o banco de dados SQLite para armazenar os detalhes. É fácil acessar os dados. Você pode verificar meu código no github. https://github.com/thiru-wta/ToDo
Métodos de banco de dados:
método get:
fonte
Você precisa simplesmente seguir estas etapas:
view.adapter
, crie um ArrayList ou um Iterator inicializado com um valor nulo.swapdata(Arraylist<T> data)
. Dentro, você fornece novos valores para a lista de matriz, o iterador ou qualquer estrutura que o sistema possa iterar usando a posição inteira no bindview. Os valores deste método são passados noonloaderfinished()
. Depois, ligue logo após a tarefanotifydatachange()
; eles pedirãoRecyclerView
para redesenhar toda a lista com novos dados do ArrayList.Na atividade ou fragmento em que você está usando o loadercalback, crie um método que transforma o cursor em uma lista de matriz ou iterador, dependendo da estrutura de dados escolhida no adaptador.
Dessa forma, você sempre pode usar o loadercalback sem bloquear o thread principal.
fonte