关于android holderview的疑惑

cnBleu 发布于 2013/08/23 10:20
阅读 862
收藏 0

在使用android的adapter时, 为了防止在getView(或类似的方法)中频繁调用LayoutInflater导致的性能降低而引入holderview的解决方法.研究它的实现发现它是用过view.setTag(holder)的方式在view不为空的时候拿出对holer的"引用"(View源码中可见:mTag = tag), 进而通过holder对子view进行一些操作. 那么现在我的实现如下:(只写getView方法中的核心实现)

public View getView(int position, View convertView, ViewGroup parent) {
        String data = mDataSet.get(position);
        if (null == convertView) {
            convertView = mLayoutInflater.inflate(R.layout.xxxx, null);
        }
        TextView nameText = (TextView) convertView.findViewById(R.id.xxx);
        nameText.setText(nameText);
        return convertView;
}

问题1:我的这种实现与holderView的实现有什么重要的不同;

问题2:在holderView不为空的前提下, holderView内的字段有没有可能为空, 如果可能为空, 那么是什么情况导致.

这就是我的疑惑, 期待各位热心的oser能解答我的疑惑, 在此先谢过.


加载中
0
cnBleu
cnBleu

这个问题提出很久了,最后自己也找到了问题所在,在这里说明下吧。

在这里,仅仅判断null == convertView是不够的,因为getview方法传递过来的convertView不为空值时也有可能并不为你预期的那个view。使用HolderView,并且在convertView不为空时取出对应的tag,只有tag是我们指定的holderView时才能确保convertView是我们预期的值。为什么这样,可以参考ListView的适配器。

0
xesam
xesam

第一,你的实现每次都要调用findViewById(R.id.xxx)

第二,基本不可能为空。

cnBleu
cnBleu
回复 @xesam : 现在的问题是在CM7.2的系统下出现了空指针,就纳闷了
xesam
xesam
回复 @柯雨 : 消耗总是相对的,所以可用可不用,自己选吧
cnBleu
cnBleu
findViewById似乎并没有带来性能的过多消耗;cm7.2系统下确实返回了空值。
返回顶部
顶部