FirebaseRecyclerPagingAdapter - 按日期排序列表
Posted
技术标签:
【中文标题】FirebaseRecyclerPagingAdapter - 按日期排序列表【英文标题】:FirebaseRecyclerPagingAdapter - sort list by date 【发布时间】:2021-07-05 13:52:12 【问题描述】:在我的应用程序中,我想显示保存在实时数据库中的新闻列表。每个新闻项目都有一个以毫秒为单位的时间戳来指示新闻的日期。我想首先使用 FirebaseRecyclerPagingAdapter 在 RecyclerView 上显示最新消息。如何做到这一点?
val baseQuery: Query = FirebaseDatabase.getInstance().reference.child("news")
val config = PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPrefetchDistance(2)
.setPageSize(3)
.build()
val options: DatabasePagingOptions<News> = DatabasePagingOptions.Builder<News>()
.setLifecycleOwner(this)
.setQuery(baseQuery, config, News::class.java)
.build()
val adapter: FirebaseRecyclerPagingAdapter<News, ViewHolder> = object : FirebaseRecyclerPagingAdapter<News, ViewHolder>(options)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder
val item = LayoutInflater.from(parent.context).inflate(R.layout.item_news_1, parent, false)
return ViewHolder(item)
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int, model: News)
viewHolder.bind(model)
override fun onLoadingStateChanged(state: LoadingState)
数据库:
"news" :
"-MXJ0Fbmvewl3zZ6-Ugn" :
"timestamp" : 1617108780000,
"description" : "A Red Bull tem a expectativa de chegar ainda melhor ao GP da Emilia Romagna de Fórmula 1, disputado no próximo dia 18 de abril, em Ímola. Após ver o holandês Max Verstappen ser batido pela Mercedes do britânico Lewis Hamilton no GP do Bahrein, o time de energéticos pretende dar um 'salto' a fim de garantir a vitória na segunda etapa da temporada 2021 da categoria máxima do ...Continue lendo",
"id" : "-MXJ0Fbmvewl3zZ6-Ugn",
"thumb" : "https://cdn-1.motorsport.com/images/amp/YpNW51X0/s6/formula-1-bahrain-gp-2021-max--2.jpg",
"title" : "F1: Red Bull deve estar ainda melhor na etapa de Ímola; saiba mais",
"url" : "http://motorsport.uol.com.br/f1/news/f1-red-bull-deve-estar-ainda-melhor-em-imola-entenda-os-detalhes/5991023/?utm_source=RSS&utm_medium=referral&utm_campaign=RSS-ALL&utm_term=News&utm_content=br"
,
"-MXJ0LxzjUjfGFDvamKE" :
"timestamp" : 1617118680000,
"description" : "As mudanças nas regras da Fórmula 1 para reduzir o downforce nos carros provaram ser uma grande dor de cabeça para as equipes no inverno europeu - e se tornaram um grande ponto de discussão no Bahrein no último final de semana. As mudanças no assoalho, dutos de freio e difusor visavam originalmente reduzir o downforce em 10%, embora as indicações sugiram que as escuderias já ...Continue lendo",
"id" : "-MXJ0LxzjUjfGFDvamKE",
"thumb" : "https://cdn-1.motorsport.com/images/amp/YBeqJen2/s6/lance-stroll-aston-martin-amr2.jpg",
"title" : "Análise técnica: entenda como as equipes de F1 responderam ao desafio do assoalho de 2021",
"url" : "http://motorsport.uol.com.br/f1/news/analise-tecnica-entenda-como-as-equipes-de-f1-responderam-ao-desafio-do-assoalho-de-2021/5992503/?utm_source=RSS&utm_medium=referral&utm_campaign=RSS-ALL&utm_term=News&utm_content=br"
,
【问题讨论】:
这取决于您的新闻在数据库中的存储方式。您可以编辑您的问题以包含/news
下的 JSON 样本(作为文本,请不要截图)?您可以通过单击 Firebase Database console 的溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。
感谢您回答@FrankvanPuffelen。我更新了问题
@VitorFerreira,在为倒置时间戳添加 orderByChild
时,我面临无限滚动。这对您来说效果如何?
【参考方案1】:
您可以使用查询按项目的timestamp
值对项目进行排序
val baseQuery: Query = FirebaseDatabase.getInstance().reference.child("news")
val orderedQuery: Query = baseQuery.orderByChild("timestamp")
这将为您提供升序的项目,因此您必须在应用程序代码中反转它们。
如果您不想这样做,请考虑在数据中存储倒置的时间戳值:
"news" :
"-MXJ0Fbmvewl3zZ6-Ugn" :
"timestamp" : 1617108780000,
"inverted_timestamp" : -1617108780000,
"description" : "A Red Bull tem a ......Continue lendo",
"id" : "-MXJ0Fbmvewl3zZ6-Ugn",
"thumb" : "https://cdn-1.motorsport.com/images/amp/YpNW51X0/s6/formula-1-bahrain-gp-2021-max--2.jpg",
"title" : "F1: Red Bull deve estar ainda melhor na etapa de Ímola; saiba mais",
"url" : "http://motorsport.uol.com.br/f1/news/f1-red-bull-deve-estar-ainda-melhor-em-imola-entenda-os-detalhes/5991023/?utm_source=RSS&utm_medium=referral&utm_campaign=RSS-ALL&utm_term=News&utm_content=br"
,
"-MXJ0LxzjUjfGFDvamKE" :
"timestamp" : 1617118680000,
"inverted_timestamp" : -1617118680000,
"description" : "As mudanças nas ...Continue lendo",
"id" : "-MXJ0LxzjUjfGFDvamKE",
"thumb" : "https://cdn-1.motorsport.com/images/amp/YBeqJen2/s6/lance-stroll-aston-martin-amr2.jpg",
"title" : "Análise técnica: entenda como as equipes de F1 responderam ao desafio do assoalho de 2021",
"url" : "http://motorsport.uol.com.br/f1/news/analise-tecnica-entenda-como-as-equipes-de-f1-responderam-ao-desafio-do-assoalho-de-2021/5992503/?utm_source=RSS&utm_medium=referral&utm_campaign=RSS-ALL&utm_term=News&utm_content=br"
,
使用上述数据结构,您可以通过以下方式按降序获取它们:
val orderedQuery: Query = baseQuery.orderByChild("inverted_timestamp")
然后您可以将orderedQuery
传递给适配器,以根据它们的降序时间戳查看项目。
【讨论】:
以上是关于FirebaseRecyclerPagingAdapter - 按日期排序列表的主要内容,如果未能解决你的问题,请参考以下文章