FirebaseRecyclerPagingAdapter - 按日期排序列表

FirebaseRecyclerPagingAdapter - sort list by date

在我的应用程序中,我想显示保存在实时数据库中的新闻列表。每个新闻项都有一个以毫秒为单位的时间戳,以指示新闻的日期。我想使用 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"
      },
    }

您可以使用查询按 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 传递给适配器,以根据降序时间戳查看项目。