Android学习笔记(十)

Android权威编程指南第十章挑战练习解答

实现高效的RecyclerView刷新

之前使用notifyDataSetChanged会刷新所有可见的列表项,但我们实际每次只会变更一个item。这就要使用单独的刷新:notifyItemChanged(int)参数为刷新的position。

首先我们需要获取当前需要刷新的position,在网上查找getLayoutPosition()和getAdapterPosition()都可以获取当前位置的position,那需要使用哪个呢?

首先这两个方法返回的position是一样的,差异在返回的速度上。

getAdapterPosition()

RecyclerView请求一个新的布局。从那时起,直到布局系统决定计算新的布局(<16 ms),由于布局尚未反映适配器的更改,因此布局位置和适配器位置可能不匹配。如果数据和适配器有关(与用户点击无关),可以使用这个方法。也就是说,用户在看见要点击的item之前,这个item的绑定的数据对应的position就已经发生了更新,尽管视图还没有变(最多延迟16ms)。比如说我想点第16个item,但是由于滑动发生了更新,我点的第16个item已经绑定了第17个item的数据,会返回第17个item的position。当然这种情况发生几率也很小,只有16ms的可能。

getLayoutPosition()

这个方法可以保证用户点击的永远是看见的,当视图发生了变化后才会返回当前的position,还拿上一个例子举例,我想点第16个item,但数据已经更新成第17个item,但由于返回的时LayoutPosition,所以点击第16个item会返回第16个item。

解决方案

所以我们使用getLayoutPosition(),在onClick中添加获取当前点击的位置。

mPosition是一个全局变量,用于保存位置。这样在唤醒的时候就选择当前的position

这个任务就完成了

优化ClimbLab的表现

之前匹配UUID需要遍历,很浪费时间。既然想要快速的找到UUID对应的Crime,我们可以使用MAP。先给Crime编号,再将UUID和编号形成键值对对应,当查询的时候直接通过Hash值计算,效果会非常好。

Java中有TreeMap和HashMap

  • TreeMap:优点在于存进去的数据自动排好序‘
  • HashMap:优点在于快速查找

HashMap速度平均O(1)最差O(n),一般不会发生Hash冲突。详细介绍可以看我之前写的另一篇文章Java中的HashSet,讲解了利用Hash存储数据。

解决方案

使用HashMap,建立键值对对应关系

速度优化:之前固定O(n),现在O(1)

发表评论