2016-08-16 104 views
1

这里是我的代码 -是什么holder.getAdapterPosition(之间)的位置属性在onBindViewHolder(差异和构造函数)

public void onBindViewHolder(myViewHolder holder, int position) { 

     //1. details obj = list.get(holder.getAdapterPosition()); 
     //2. details obj = list.get(position); 

     holder.position = position; 
    } 

我得到一个警告

为固定

不要把位置;只能立即使用并致电 holder.getAdapterPosition()稍后查看RecyclerView不会 当项目的位置在 数据集更改时再次调用onBindViewHolder,除非项目本身无效或无法确定新位置 。出于这个原因,您应该只在使用 方法获取相关数据项时使用位置参数 ,并且不应保留其副本。如果您稍后需要 某个项目的位置(例如,在点击侦听器中),请使用getAdapterPosition() ,稍后将更新适配器位置。

所以我很困惑从1和2哪个我应该喜欢,为什么?正如它所说的getAdapterPosition()给出了更新的位置,我从基于位置的列表中获取值。

谢谢。

回答

3

您收到的警告不是关于使用positiongetAdapterPosition()。它是关于保存位置:

holder.position = position; 

你并不需要保存的位置在你的持有人,因为它的位置可以改变,你可以随时通过调用holder.getAdapterPosition()获得其位置;

从文档:

注意与ListView控件,RecyclerView不会再如果在数据集中的项目变化,除非 项目本身是无效的或位置的新位置不能调用此方法 被确定。 由于这个原因,您应该只使用位置参数,而 获取此方法内的相关数据项,并且不应保留 它的副本。如果您稍后需要某个项目的位置(例如,在 点击侦听器中),请使用getAdapterPosition(),该适配器将具有更新的 适配器位置。

关于其使用方法:

两者都应返回相同的结果,如果叫onBindViewHolder方法内。我会建议使用position,因为它是最简单和最安全的。