我有一个可扩展列表适配器。在其中我像这样 inflatedView
if (view == null) {
view = LayoutInflater.from(mContext).inflate(R.layout.trigger_list_item, null);
holder = new ViewHolder();
holder.mTrigger = trigger;
holder.triggerName = view.findViewById(R.id.triggerName);
holder.upButton = view.findViewById(R.id.mTriggerButtonUp);
holder.downButton = view.findViewById(R.id.mTriggerButtonDown);
holder.total = view.findViewById(R.id.triggerCounter);
view.setTag(holder);
}
else {
holder = (ViewHolder) view.getTag();
}
我遇到了一个问题,我对一个 View 所做的更改有时会影响其他 View ,但并非总是如此。当我取出 view 和 null 的检查时,它起作用了,留下这个。
view = LayoutInflater.from(mContext).inflate(R.layout.trigger_list_item, null);
holder = new ViewHolder();
holder.mTrigger = trigger;
holder.triggerName = view.findViewById(R.id.triggerName);
holder.upButton = view.findViewById(R.id.mTriggerButtonUp);
holder.downButton = view.findViewById(R.id.mTriggerButtonDown);
holder.total = view.findViewById(R.id.triggerCounter);
view.setTag(holder);
这似乎可行,但我一直都学会了使用 if (view == null)
检查已经存在的 View 。我有理由不接受这个修复吗?是否存在内存泄漏或与此相关的任何问题?
最佳答案
I was having an issue where a change i made to one view would sometimes, though not always, effect others.
当您有时而不是总是只修改 View 的一部分时,通常会发生这种情况。例如,您可能有
if (position % 3 == 0) {
someView.setBackgroundColor(0xff0000ff);
}
如果您的 View 被回收并稍后传递给 getView()
(作为 convertView
参数),它仍将具有蓝色背景。您应该改为编写代码以始终设置背景颜色:
if (position % 3 == 0) {
someView.setBackgroundColor(0xff0000ff);
} else {
someView.setBackgroundColor(0xffffffff);
}
I had always learned to check for the view already existing with if (view == null). Is there a reason I shouldn't accept this fix?
是的: inflatedView 既昂贵又耗时。如果您想确保您的应用程序在用户浏览您的列表时不会丢失任何帧,您应该利用 getView()
提供的回收功能。这并不像 inflatedView 慢得令人痛苦,但如果你每次都膨胀一个新 View (因此每次也使用大量的 findViewById()
调用),你肯定会注意到滚动不如如果您遵循 View 持有者模式。
关于java - 在列表适配器中是否有我应该检查现有 View 的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49483692/