【问题标题】:How to hack DataSource to use static data? (convert List<T> to DataSource<Int, T>)如何破解 DataSource 以使用静态数据? (将 List<T> 转换为 DataSource<Int, T>)
【发布时间】:2019-12-19 12:12:42
【问题描述】:

我有一个 UI 组件,它接受 LiveData&lt;PagedList&lt;T&gt;&gt;,但在一种情况下,我需要将它用于直接从 RecycleViewer 传递的数据(RecycleViewer 产生结构为 List&lt;Object&gt; 的输出)。我可以很容易地将它映射到Map&lt;Int, Object&gt;,但是映射不能转换为DataSource,所以我需要以某种方式将它转换为DataSource&lt;Int, Object&gt;或直接转换为&lt;PagedList&lt;Object&gt;&gt;

我尝试了以下方法,但不幸的是它不起作用 -> 错误是您无法将 MutableMap 转换为 DataSource。有什么想法吗?

class DataSourceFactory(
    val data: List<Object>
) : DataSourceFactory<Object>() {

   override fun create(): DataSource<Int, Object> {

        val mappedData = mutableMapOf<Int, Object>()
        var index = 0
        for (object in data) {
            mappedData[index] = object
            index = +1
        }
        return mappedData as DataSource<Int, Object>
    }
}

【问题讨论】:

  • 嵌入式内存数据库,如 H2 可以交付,非常简单。
  • 您能说得更具体些吗?我正在传递给 RecyclerViewer List&lt;Pair&lt;String?, List&lt;Object&gt;&gt;&gt;,而 RecyclerViewer 正在使用 pairData.first(即String?)并将其显示为视图的标题,我需要将 pairData.second(即List&lt;Object&gt;)传递给此 UI 组件为 DataSource&lt;Int, Object&gt;
  • 抱歉忘记是安卓了,经验不足。幸运的是已经有了答案。

标签: java android kotlin android-livedata


【解决方案1】:

首先,Kotlin 中没有 Object,你应该使用 Any。由于 DataSource 未实现 Map 接口,您会收到错误消息。如果不想在 DataSource 中添加 Map 接口,可以这样做:

override fun create(): DataSource<Int, Any> {
    val dataSource = DataSource<Int, Any>()
    data.mapIndexed { index, any -> dataSource.put(index, any) }
    return dataSource
}

只需调整方法以将元素添加到 DataSource - 我在此示例中使用 put

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 2014-02-05
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2019-04-13
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多