我正在为开源库做贡献,但是在这段代码中出现了一个lint错误:"Do not treat position as fixed; only use immediately and call holder.getAdapterPosition() to look it up later"
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
mAdapter.onBindViewHolder(holder, position);
if (!isFirstOnly || position > mLastPosition) {
for (Animator anim : getAnimators(holder.itemView)) {
anim.setDuration(mDuration).start();
anim.setInterpolator(mInterpolator);
}
mLastPosition = position;
} else {
ViewHelper.clear(holder.itemView);
}
}
我已经检查过了,这是因为该位置被保存供将来使用。这是向库的创建者提出的一个问题,为什么他们需要这种逻辑。但当我将该位置的使用方式更改为使用 holder.getAdapterPosition()
时,问题消失了:
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
mAdapter.onBindViewHolder(holder, position);
if (!isFirstOnly || holder.getAdapterPosition() > mLastPosition) {
for (Animator anim : getAnimators(holder.itemView)) {
anim.setDuration(mDuration).start();
anim.setInterpolator(mInterpolator);
}
mLastPosition = holder.getAdapterPosition();
} else {
ViewHelper.clear(holder.itemView);
}
}
我认为从概念上讲并没有太大变化,但现在Lint已经满意了。为什么呢?
mLastPosition
可能不是最后一个可见项。 - S.D.