java - 在列表适配器中是否有我应该检查现有 View 的原因?

标签 java android layout-inflater android-viewholder

我有一个可扩展列表适配器。在其中我像这样 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/

相关文章:

android - 如何将 textView 膨胀为布局

android - "The specified child already has a parent. You must call removeView() on the child' s parent first”第二次创建AlertDialog

java - java中 '&'和 '&&'有什么区别

android - SwipeRefreshLayout -- 如何检测拖动距离?

java - 在 Activity 之间传递和显示 json 数据不起作用?

android - 无法使用 Fragment.setRetainInstance() 替代 Activity.onRetainNonConfigurationInstance()

java - LayoutInflater 不返回新对象

java - 如何构建自己的java框架

java - 如何使用 Spring Boot 提供不同的数据库配置?

java - servlet 是单例吗?