android适配器高效的视图操作

时间:2013-11-07 05:58:00

标签: android performance android-custom-view android-adapter

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

例如:

1。在布局中使用单个ImageButton视图,并使用 setBackgroundResource

更改条件中的ImageButton
  

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个ImageButton视图,只更改要显示哪个ImageButton的 可见性

@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. 还有一个说自己总是选择自定义视图,因为它更好
  4. 我已经尝试了所有3,但他们看起来仍然具有相同的性能。我可能错过了一些东西,或者有更好的方法来做到这一点以获得更好的性能?

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

3 个答案:

答案 0 :(得分:0)

我相信第一个更好,但请参考这个惊人的tutorial关于如何优化列表视图150%,还有另一个视频来优化它的175%,但你必须先了解第一个视频

答案 1 :(得分:0)

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

另外一条建议是不要在屏幕上使用太多的视图 [即视图层次中始终存在可见/不可见] ,并且更好地使用viewgroup,因为它们当他们真正需要时进入画面。

答案 2 :(得分:0)

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

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

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

就你的疑虑而言:

  

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

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

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

  

getView()中的图像设置会导致很多工作   Android系统

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

  

有一种说法总是用于自定义视图,因为它更好

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

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

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

ImageView