如何编写自定义View的set方法

How to write set methods of custom Views

我已经编写了 View 的子类,并且包含了一个设置字段的方法。字段的值影响View的大小和View的内容。

我必须在 set 方法中写什么才能确保视图正确更新并立即生效?我问是因为当我使用自己的自定义视图作为 ListView 项目布局的一部分时,我发现当我尝试使用 [=17] 的 convertView 参数来回收自己的视图时=]的getView方法,有时候set方法好像不行。

这是我正在尝试做的事情的人为示例。我才刚刚开始学习如何扩展 View,所以这段代码可能还有其他问题。

public final class SpotsView extends View {

    private final MyActivity activity;
    private int numberOfSpots;

    public SpotsView(MyActivity activity) {
        super(activity);
        this.activity = activity;
    }

    public void setNumberOfSpots(int numberOfSpots) {
        this.numberOfSpots = numberOfSpots;
        // What do I have to write here?? invalidate()? forceLayout()?
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Resources resources = activity.getResources();
        setMeasuredDimension(
            (int) (numberOfSpots * resources.getDimension(R.dimen.block_width)),
            (int) resources.getDimension(R.dimen.spots_view_height)
        );
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int height = getHeight();
        int width = getWidth();
        float radius = activity.getResources().getDimension(R.dimen.network_outer_radius);
        for (int i = 0; i < numberOfSpots; i++)
            canvas.drawCircle((i + 0.5F) * (width / numberOfSpots), height * 0.5F, radius, activity.spotPaint());
    }
} 

看来你得打电话

invalidate();
requestLayout();

根据TextView#setCompoundDrawablePadding()的源代码,一种影响视图内容和大小的方法。