0

您好我有一个扩展 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. 还有一个说总是选择自定义视图,因为它更好

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

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

4

3 回答 3

0

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

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

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

至于你的疑问:

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

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

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

getView()里面的图片设置给Android系统带来了很多工作

这是真的(理论上),尽管我不确定人类是否真的能感受到性能差异。因此,就理论性能而言,上述方案(2)略胜一筹。

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

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

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

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

于 2013-11-07T06:31:43.673 回答
0

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

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

于 2013-11-07T06:11:13.413 回答
0

我相信第一个更好,但请参阅这个关于如何将列表视图优化 150% 的惊人教程,还有另一个视频将其优化为 175%,但您必须先了解第一个视频。

于 2013-11-07T06:04:24.357 回答