【问题标题】:Dynamic creation of view (textView, imageVIew etc.) in loop hangs the Android device. How to solve this?在循环中动态创建视图(textView、imageVIew 等)会挂起 Android 设备。如何解决这个问题?
【发布时间】:2020-01-18 08:13:55
【问题描述】:

我正在创建动态视图并将其添加到循环中的父布局中。因此,当数据更大时,它会在设置视图时挂起android系统。

如何阻止这种情况?或者任何更好的方法来填充不会挂断设备的大型动态数据。

基本操作:

  1. 我得到一个包含一些格式信息的数据列表

  2. 运行循环并根据不同类型数据(文本、图像、链接等)的 switch case 动态创建视图,并将该视图添加到父布局中。

【问题讨论】:

  • 请使用多种类型的RecyclerView。

标签: android memory memory-management profiler android-profiler


【解决方案1】:

请不要习惯在不使用 RecyclerView 的情况下手动将大量 UI 元素动态添加到屏幕上。有两种方法可以使用 RecyclerView 将数据传播到屏幕。

  1. 为每种数据类型创建带有 class CurrentItem(itemView: View) : RecyclerView.ViewHolder(itemView), DataTypeItem 之类标题的 UI 组件。 DataTypeItem 是每种数据类型的接口。比创建RecyclerView 并在适配器RecyclerView.Adapter<DataTypeItem> 中。现在您的适配器能够通过接口DataTypeItem 显示您的所有数据类型。在适配器覆盖方法onBindViewHolder(holder: DataTypeItem, position: Int) 中,将持有人重新键入CurrentItem。最后将传入的数据传播到 UI 组件。
  2. 仅在不使用 UI 组件的情况下为您的数据创建布局。 Here 是一个很好的例子,如何做到这一点。

【讨论】:

  • 在使用recyclerView填充动态视图时,recyclerView的onScroll,数据项顺序发生变化。如何防止这种情况发生? @dzejkob23
  • 如果您的传入数据顺序已更改,那么您可以创建带有索引的地图。这些索引是适配器中屏幕上的项目位置。如果您更改所有项目调用notifyDataSetChanged,只有项目范围notifyItemRangeChanged,只有一项notifyItemChanged 或notifyItemMoved。通过这些方法,您可以在屏幕上传播更改。
猜你喜欢
  • 2015-01-25
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 2019-02-23
  • 2013-02-27
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
相关资源
最近更新 更多