Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中显示4层列表_Android_Kotlin_Android Recyclerview - Fatal编程技术网

在Android中显示4层列表

在Android中显示4层列表,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,我必须显示按日期排序的事件。Json如下所示: [{ year: Int, months: [{ month: String, days:[{ date:String, events:[{ title: String description: String }] }] }] }] 2000

我必须显示按日期排序的事件。Json如下所示:

[{
    year: Int,
    months: [{
        month: String,
        days:[{
            date:String,
            events:[{
                title: String
                description: String
            }]
        }]
    }]
}]
2000
  Jan
    1st
      Stuff 1 | Stuff 2
    20th
      Stuff 3
  Apr
    2nd
      Stuff 4
2001
  Jul
    15th
       Stuff 5 | Stuff 6 
所以我有一个数组里面的一个数组里面的。。。 为了显示第一层(年份),我创建了一个回收器视图+适配器。但是现在呢?如何显示月份、月份中的天数以及这些天的事件

在屏幕上,它应该如下所示:

[{
    year: Int,
    months: [{
        month: String,
        days:[{
            date:String,
            events:[{
                title: String
                description: String
            }]
        }]
    }]
}]
2000
  Jan
    1st
      Stuff 1 | Stuff 2
    20th
      Stuff 3
  Apr
    2nd
      Stuff 4
2001
  Jul
    15th
       Stuff 5 | Stuff 6 
年、月、日是垂直的,事件是水平的。所有垂直元素的行为都应该像一个元素,即当您滚动时,它们都会滚动


我发现示例只有两层,一层垂直,一层水平。如何处理4层?

来阐明我的意思

模型 你需要将你的模型展平,这样它就可以成为一个“事物”列表

您可以有一个抽象的
对象
,其中包含一些基本的模型信息,例如
标识符
,如果您关心如何将这些对象链接在一起,还可以有一个
父标识符

最终,每个模型都需要至少有一个
类型
。例如:(这将是kotlin伪代码,只是让您知道…,可能有输入错误或不一致之处,但这是为了让您了解如何解决数据问题)

RemoteThing
(以及
RemoteYear、month等
)是想象中的类,如果您将JSON解析为“某种形式的数据模型”,我认为您可能会拥有这些类

现在,这个过程将把这个RemoteDomainObjects转换成本地域问题(即适合本地域/问题的数据)

我希望这是有道理的

最后,对适配器进行
分类:ListAdapter(…)
并执行
adapter.submitList(results)
,第二个问题开始了

适配器 在这里我不会详细介绍(请查看无数具有类型和嵌套类型的RecyclerViews示例,例如,向您展示如何区分平面对象以充气显示不同UI的不同viewHolder的示例

在该示例中,您可以看到有两种类型的对象:

ColoredViewHolder
AdViewHolder

他们膨胀不同的布局,因此看起来不同

DiffUtil? 请注意,您需要一个
DiffUtil.ItemCallback
来传递给ListAdapter的构造函数。在同一个文件中,您可以看到一个简单的例子(基本上,它允许适配器比较项,以了解当您
提交列表(…)
时哪些项/何时/哪些项发生了更改)

结论 您一开始就遇到了如何在RecyclerView中处理嵌套和结构化数据的难题,现在我将您的问题转向了数据转换,然后是表示问题,但两者之间有着更好的协同作用,因为每个问题都使另一个问题的生活更轻松

水平的? 至于日间事件的水平显示,您可以让您的
EventListViewHolder
在水平模式下拥有并管理一个小型(er)内部回收视图(及其适配器)或者,您可以尝试利用类似于的工具;最终,这并不重要,只要您将问题控制在一起并将其分开。也就是说:外部RV不关心/不知道ViewHolder如何显示这些信息;上述数据转换过程也不关心/不知道

每个类别/职能都有少量/有限的职责

嵌套循环?!! 是的,我知道这看起来很疯狂,但这就是你拥有的数据,嵌套的和集合中的数据,所以你应该横穿它来转换它。有很多方法可以做到这一点,我的是伪代码,让你知道你拥有什么和你想要什么

如果您使用协同路由,这可能是一个挂起函数,它在计算“dispatcher”中执行此操作,同时您的ViewModel在将数据传递到UI之前等待数据

这是一种方式(我会选择):)


祝你好运!

我想你需要
SectionedRecyclerView
。首先你需要弄清楚你想让它们如何被分割。我不明白你的意思,你想在列表中显示一个或多个可滚动的列表吗?如果你想要前者,那么你需要将你的数据转换成一个简单的“事物”列表绑定到RV适配器。在您的示例中,例如:2000/2001将是“YearViewHolders”,Jan、Apr等将是MonthViewHolders;您将有DayViewHolders和“StuffViewHolders”。提前展平阵列,格式化数据以使您的RV/适配器(和您的)寿命更长更简单。使用
ListAdapter
DiffUtil
来简化更新。要扩展:考虑展平此数据的“复杂性”,您必须迭代、添加到集合、创建数据模型和分配类型等。如果您没有这样做,请回收视图和适配器除了他们已经很复杂的职责之外,还必须同步工作来为您协调所有这些。不同的设计:您使用
getViewType(…)
方法为每个“元素”返回不同的ViewHolder实现。这里提供了一个使用viewType的示例:(查看此适配器:).至于第二个问题:当你创建“列表”时,你在你的“模型”中这样做。这是你问题的关键部分。一旦你将其展平,剩下的就“简单”。至于“垂直与水平”的“垂直与水平”,这确实需要两个RVs或某种形式的水平滚动“行”(可以是RV的视图持有者,它在水平滑动视图或类似视图中专门膨胀“物品”列表。但请记住,这些是不同的问题。首先找出要显示的“物品”列表的结构,然后再对所述物品进行“展示”。我在这里进行简化(我无法访问您的问题域)但这是我的方向。