安卓适配器高效操作视图



嗨,我有一个扩展 ArrayAdapter 的自定义类。我希望能够根据创建适配器时提供的 List 对象数据更改 ImageButton 背景图像。我的问题是以下哪种方法更好。

例如:

1. 在布局中具有单个图像按钮视图,并使用 setBackgroundResource 在条件中更改图像按钮

public View getView(int position, View convertView, ViewGroup parent){ ....

    if (myObject.getParent().equalsIgnoreCase("mom")){
        holder.button.setBackgroundResource(R.drawable.button_a);
    }else if(myObject.getParent().equalsIgnoreCase("dad")){
        holder.button.setBackgroundResource(R.drawable.button_b);
    }
      ....
}
2

.在布局中具有2个图像按钮视图,只需更改要显示的图像按钮的可见性

@Override
public View getView(int position, View convertView, ViewGroup parent) {
     ....
   if (myObject.getParent().equalsIgnoreCase("mom")){
      holder.buttonA.setVisibility(View.VISIBLE);
      holder.buttonB.setVisibility(View.GONE);
   }else if(myObject.getParent().equalsIgnoreCase("dad")){
      holder.buttonB.setVisibility(View.VISIBLE);
      holder.buttonA.setVisibility(View.GONE);
   }
     ....
}

3. 拥有这样的自定义 ImageButton 类

public class CustomButton extends ImageButton {
  public CustomButton(Context context) {
      super(context);
      // TODO Auto-generated constructor stub
      setForMom();
  }
  public CustomButton(Context context, AttributeSet attrs,
          int defStyle) {
      super(context, attrs, defStyle);
      // TODO Auto-generated constructor stub
  }
  public CustomButton(Context context, AttributeSet attrs) {
      super(context, attrs);
      // TODO Auto-generated constructor stub
  }
  public void setForMom(){
      setBackgroundResource(R.drawable.button_a);
  }
  public void setForDad(){
      setBackgroundResource(R.drawable.button_b);
  }
  public void hide() {
      this.setVisibility(View.GONE);      
  }
}

我在文章中读到以下内容:

  1. 视图越小越好。 (这可能意味着使用自定义视图类)
  2. getView() 中的图像设置导致 Android 系统需要大量工作
  3. 还有一个说总是去自定义视图,因为它更好

我已经尝试了所有 3 个,但它们看起来仍然具有相同的性能。我可能错过了一些东西,或者有更好的方法来做到这一点以获得更好的性能?

顺便说一句:我正在使用 https://github.com/huewu/PinterestLikeAdapterView,我的应用程序显示就像pinterest一样。它显示图像,文本和单击后要更改的图像按钮(即单击后要更改背景的图像按钮)。我也在使用视图回收方法,我只是没有在这里显示。.

我相信

第一个更好,但请参阅这个惊人的教程,了解如何将列表视图优化 150%,还有另一个视频可以优化它 175%,但你必须首先了解第一个视频。

好吧,我在这里看不到的是一种ViewHolder的方法,它有助于优化内存并减少滚动列表视图时的延迟,还可以提高帧速率

还有一个建议是不要在屏幕上使用太多视图[即可见/不可见视图始终存在于视图层次结构中]并更好地使用viewgroup,因为它们在实际需要时会出现在图片中。

由于列表视图中的视图会自动回收,因此您无法看到性能差异。也就是说,即使您的列表非常庞大,任何时候也只有少数视图。

(1) 和 (3) 的性能应相同。原因是你在做完全相同的事情。根据数据的值,您可以将后台资源设置为 ab 。在自定义视图中,您有一个额外的函数调用setForMom/setForDad(但这应该不会产生太大区别)但是由于每次调用getView时后台资源都会更改,因此它可能会对滚动性能产生影响,正如我稍后解释的那样。

(2)有两个按钮。这意味着创建每个项目将意味着初始化两个ImageButtons..从理论上讲,这比初始化和绘制 1 个按钮要慢,但由于 listView 回收视图,这意味着只有初始加载会(稍微/几乎可以忽略不计)变慢,滚动性能不会受到影响。

至于你的疑问:

视图越小越好。(这可能意味着使用自定义视图 类)

视图越小越好......这是真的。因为它们可以快速初始化和绘制。但是,这并不意味着使用自定义视图类。自定义视图也可能很大,它们可能具有复杂的布局,因此可能会很慢。

人们有时更喜欢自定义视图的原因是,他们希望将某些逻辑分组到一个类中,并在不同的地方重用它。它与:小尺寸视图或复杂视图无关。

getView() 中的图像设置导致 安卓系统

这是真的(理论上),尽管我不确定人类是否真的能感受到性能差异。因此,上述选项(2)在理论性能方面略好一些。

有一种说总是选择自定义视图,因为它更好

这并不真正正确(在我看来)。总是一个强有力的词。如果您只想显示文本或图像,您应该使用自定义视图吗?不。我使用自定义视图的主要论点是:

(1)可重用性 因此,一个组件可以在多个地方重复使用。假设我创建了一个显示用户个人资料图片和名称的自定义视图。然后我可以在不同的活动中使用它,而不必每次都从头开始创建它(使用 ImageViewTextView )。

(2)抽象。一些仅特定于特定视图的逻辑可以分组到其中。假设我希望我的图像在点击它时放大。我可以将此逻辑分组到自定义视图中,并创建一个扩展TappableImageView ImageView

相关内容

最新更新