java - 在 RecyclerView 中过滤
问题描述
我用这样的数据初始化了 RecyclerView 女巫:
data class ObjectData(
var name: String,
var pass: Boolean
) : Serializable
我正在使用 ArrayList 初始化适配器。在我的活动中,我有过滤器(全部、通过、未通过)。当我单击其中一个过滤器时,我希望 RecyclerView 刷新有关“通过”值的新数据。示例:在“通过”过滤器按钮上,它将仅显示具有 pass=true 的 ObjectData。
问题:最好的方法是什么?我可以保存 3 个列表视图,一个包含所有数据,一个包含传递的对象,一个包含未传递的对象,并在更改过滤器时使用所需的列表更新适配器。但这会导致数据重复。我可以在过滤器上将所有数据复制到新的过滤列表,但它会在每个按钮过滤器单击时触发复制,并且用户可以快速更改过滤器。
你有什么建议。
解决方案
我会简单地创建副本并缓存它们,例如:
data class ObjectData(
var name: String,
var pass: Boolean
) : Serializable
val allData: List<ObjectData> = emptyList()
val filteredData: Map<Boolean, List<ObjectData>> by lazy {
allData.groupBy { it.pass }
}
这样,您将一次性创建两个过滤列表,并且仅在需要时创建。
老实说,如果数据集不大,除非我看到性能很差,否则我不会过早地进行优化。现在Android有更好的内存处理。
推荐阅读
- javascript - Highcharts 饼图高度自动调整大小,包括图例
- html - 如何更改 html 中标题的字体系列?
- r - 排序固定次数
- docker - 如何将 docker 容器地址映射到自定义的“redis://redis:6379”主机?
- python - 如何将具有较小形状的张量分散到较大的张量?
- javascript - 然后在promise外部声明变量,然后在promise内部初始化,然后在promise外部访问
- php - 第一次尝试我正在处理登录/注册表单。收到错误
- javascript - 如何通过使用键值对将两个具有两种不同大小的对象数组合并到一个数组中?
- apache-spark - Spark 事件日志 HDFS 一致性
- android - 检测 USB OTG 设备何时断开连接