Android适配器和convertView回收行为

时间:2014-01-02 19:22:17

标签: android performance android-adapter

我有一个问题,搜索SO和谷歌后我找不到答案。在Android中使用适配器时,最好使用convertView方法中的getView()参数重用列表项视图。我的问题是,如果我对convertView做出更改,这种更改是否会持续到将来调用getView()

例如:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            ViewHolder holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);

            convertView.setTag(holder);

            // if i call this method here, will all future views passed into convertView
            // also have this set??
            // From what I know about Java and objects I would guess yes
            // but I'm not 100% sure how Android processes the convertView behind the scenes
            ((ViewGroup) convertView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        }

        ViewHolder holder = (ViewHolder) convertView.getTag();

        // currently setDescendantFocusability is called here,
        // I want to move it to where it above to help improve performance
        return convertView;
    }

2 个答案:

答案 0 :(得分:2)

我是这么认为的。

  1. 您操作的已转换视图将在以后重复使用。

  2. 当您获得getView()方法传递的转换视图时,之前可能已使用过特定的转换视图,因此请确保更新当前转换视图可能较脏的所有属性。

  3. 应该是以下代码:

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;
            if(view == null){
                view = createSpecificView();
            }
    
            updateSpecificView(view);//update all attributes here.
            return view;
        }
    

    希望可以帮到你。

答案 1 :(得分:2)

您需要在getView()结尾处返回convertView的唯一原因是它为null并且/或者您创建了一个新实例。将对象作为参数传递时,可以修改基础对象的状态,但不能更改或创建新对象。您无法更改convertView指向的对象。

因此,您还可以在方法结束时返回convertView。这包括您创建新对象的情况。