填充观看次数的最佳方式

时间:2016-09-27 15:52:49

标签: android performance

我正在开发自定义布局,它具有很少的属性。 Attrs:

<declare-styleable name="CustomLayout"> //other attr... <attr name="data_set" format="reference"/> </declare-styleable>

数据集只是一个字符串数组,据我通过填充视图来填充我的布局:

private Option[] mOptions; // just an array for filing content

public CustomLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    TypedArray array = context
            .obtainStyledAttributes(attrs, R.styleable.CustomLayout);
    int arrayId = array.getResourceId(R.styleable._data_set, -1);
    if (arrayId != -1) {
        array = getResources().obtainTypedArray(arrayId);
        mOptions = new Option[array.length()];
        for (int index = 0; index < array.length(); index++) {
            mOptions[index] = new Option();
            mOptions[index].setLabel(array.getString(index));
        }
        populateViews();
    }

    array.recycle();
}

private void populateViews() {
    if (mOptions.length > 0) {
        for (int index = 0; index < mOptions.length; index++) {
            final Option option = mOptions[index];
            TextView someTextView = (TextView) LayoutInflater.from(getContext())
                    .inflate(R.layout.some_layout, this, false);
            //other initialization stuff
            addView(someTextView);
        }
    }

填充视图的最佳位置在哪里? 我知道addView()触发requestLayout()和invalidate() - 这不是最好的方法对于多件物品,不是吗?那么我应该怎么做,我应该使用基于适配器的方法吗?

1 个答案:

答案 0 :(得分:2)

实际上很好。它请求布局,但不会立即进行布局。它基本上向处理程序发布消息,表明需要布局。对于invalidate也是如此。因此,在UI线程返回到looper之前,不会进行实际布局。这意味着如果你连续添加一堆项目,它实际上只会布局一次。