嗨,我有一个扩展 ArrayAdapter 的自定义类。我希望能够根据创建适配器时提供的 List 对象数据更改 ImageButton 背景图像。我的问题是以下哪种方法更好。
例如:
1. 在布局中具有单个图像按钮视图,并使用 setBackgroundResource 在条件中更改图像按钮
2public 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个图像按钮视图,只需更改要显示的图像按钮的可见性
@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); } }
我在文章中读到以下内容:
- 视图越小越好。 (这可能意味着使用自定义视图类)
- getView() 中的图像设置导致 Android 系统需要大量工作
- 还有一个说总是去自定义视图,因为它更好
我已经尝试了所有 3 个,但它们看起来仍然具有相同的性能。我可能错过了一些东西,或者有更好的方法来做到这一点以获得更好的性能?
顺便说一句:我正在使用 https://github.com/huewu/PinterestLikeAdapterView,我的应用程序显示就像pinterest一样。它显示图像,文本和单击后要更改的图像按钮(即单击后要更改背景的图像按钮)。我也在使用视图回收方法,我只是没有在这里显示。.
第一个更好,但请参阅这个惊人的教程,了解如何将列表视图优化 150%,还有另一个视频可以优化它 175%,但你必须首先了解第一个视频。
好吧,我在这里看不到的是一种ViewHolder
的方法,它有助于优化内存并减少滚动列表视图时的延迟,还可以提高帧速率。
还有一个建议是不要在屏幕上使用太多视图[即可见/不可见视图始终存在于视图层次结构中]并更好地使用viewgroup
,因为它们在实际需要时会出现在图片中。
由于列表视图中的视图会自动回收,因此您无法看到性能差异。也就是说,即使您的列表非常庞大,任何时候也只有少数视图。
(1) 和 (3) 的性能应相同。原因是你在做完全相同的事情。根据数据的值,您可以将后台资源设置为 a
或b
。在自定义视图中,您有一个额外的函数调用setForMom/setForDad
(但这应该不会产生太大区别)但是由于每次调用getView
时后台资源都会更改,因此它可能会对滚动性能产生影响,正如我稍后解释的那样。
(2)有两个按钮。这意味着创建每个项目将意味着初始化两个ImageButtons
..从理论上讲,这比初始化和绘制 1 个按钮要慢,但由于 listView 回收视图,这意味着只有初始加载会(稍微/几乎可以忽略不计)变慢,滚动性能不会受到影响。
至于你的疑问:
视图越小越好。(这可能意味着使用自定义视图 类)
视图越小越好......这是真的。因为它们可以快速初始化和绘制。但是,这并不意味着使用自定义视图类。自定义视图也可能很大,它们可能具有复杂的布局,因此可能会很慢。
人们有时更喜欢自定义视图的原因是,他们希望将某些逻辑分组到一个类中,并在不同的地方重用它。它与:小尺寸视图或复杂视图无关。
getView() 中的图像设置导致 安卓系统
这是真的(理论上),尽管我不确定人类是否真的能感受到性能差异。因此,上述选项(2)在理论性能方面略好一些。
有一种说总是选择自定义视图,因为它更好
这并不真正正确(在我看来)。总是一个强有力的词。如果您只想显示文本或图像,您应该使用自定义视图吗?不。我使用自定义视图的主要论点是:
(1)可重用性 因此,一个组件可以在多个地方重复使用。假设我创建了一个显示用户个人资料图片和名称的自定义视图。然后我可以在不同的活动中使用它,而不必每次都从头开始创建它(使用 ImageView
和 TextView
)。
(2)抽象。一些仅特定于特定视图的逻辑可以分组到其中。假设我希望我的图像在点击它时放大。我可以将此逻辑分组到自定义视图中,并创建一个扩展TappableImageView
ImageView