【问题标题】:Android Adapter and convertView Recycling BehaviorAndroid Adapter 和 convertView 回收行为
【发布时间】:2014-01-02 19:22:16
【问题描述】:

我有一个问题,在搜索 SO 和 Google 后我找不到答案。在 Android 中使用适配器时,通过在 getView() 方法中使用 convertView 参数来重用列表项视图是一种很好的做法。我的问题是,如果我对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;
    }

【问题讨论】:

标签: android performance android-adapter


【解决方案1】:

我想是的。

  1. 您操作的转换后的视图将来会被重复使用。

  2. 当你得到一个通过getView()方法传递的转换视图时,特定的转换视图可能已经被使用过,所以请确保更新所有可能对当前转换视图脏的属性。

应该是下面的代码:

    @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;
    }

希望能帮到你。

【讨论】:

    【解决方案2】:

    您需要在 getView() 结束时返回 convertView 的唯一原因是它为 null 和/或您创建一个新实例的情况。当对象作为参数传递时,您可以修改底层对象的状态,但不能更改或创建新对象。您无法更改 convertView 指向的对象。

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

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 2015-08-15
      • 2015-02-25
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多