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 - 按日期排序列表的主要内容,如果未能解决你的问题,请参考以下文章