5
private class HSV extends HorizontalScrollView {
    public LinearLayout L;
    public AbsoluteLayout A;
    public HSV(Context context) {
        super(context);
        L = new LinearLayout(context);
        A = new AbsoluteLayout(context);
    }
    @Override public void addView(View child) {
        A.addView(child);
    }
    void update_scroll() {
        removeView(L);
        addView(L, 0);
        L.removeView(A);
        L.addView(A);
        A.invalidate();
        L.invalidate();
        invalidate();
        requestLayout();
    }
    int GetCurrentPos() {
        return getScrollX(); // <-- this line if HSV
        return getScrollY(); // <-- this line if VSV
    }
    ... few more methods skipped, they will not change at all in 'vertical' version
}

我有这门课,它完美地满足了我的需求。现在我需要新的 VSV 类,它将派生自(垂直)ScrollView 并且是一样的。我当然可以复制整个块并将 extends Horizo​​ntalScrollView 更改extends ScrollView,然后将(L, 0)更改为(0, L)(哎呀,这是在 SO 上发布时出现的错误,肯定那行不会改变,GetCurrentPos 会)。

或者我可以添加“布尔垂直”属性。但是 Java 没有模板或宏,也没有运行时原型,那么 Java 中是否有其他方法可以避免此示例中的代码重复?

4

1 回答 1

2

查看android.widget.ScrollViewandroid.widget.Horizo​​ntalScrollView的文档,它们似乎都实现了

void addView(View child, int index)

因此,如果我在这里没有遗漏任何内容,您就不必更改那行代码。此外,这两个类都从android.view.ViewGroup继承了这个方法。所以,如果两个类的实现是相同的,你可以做这样的事情

public abstract class ScrollViewDelegate<T extends FrameLayout> {
  private final T view;
  private LinearLayout L;
  private AbsoluteLayout A;

  public ScrollViewWrapper(T view) {
    this.view = view;
    L = new LinearLayout(view.getContext());   // or pass as parameter
    A = new AbsoluteLayout(view.getContext()); // or pass as parameter
  }

  void update_scroll() {
      view.removeView(L);
      view.addView(L, 0);
      L.removeView(A);
      L.addView(A);
      A.invalidate();
      L.invalidate();
      view.invalidate();
      view.requestLayout();
  }
  // ...
}

在 HSV/VSV 中,您可以委托给此类(如有必要)。

public class HSV extends HorizontalScrollView {

  private final ScrollViewDelegate<HorizontalScrollView> delegate;

  public HSV(Context context) {
      super(context);
      this.delegate = new ScrollViewDelegate<HorizontalScrollView>(this);
  }
  // do stuff with this.delegate
}

public class VSV extends ScrollView {

  private final ScrollViewDelegate<ScrollView> delegate;

  public VSV(Context context) {
      super(context);
      this.delegate = new ScrollViewDelegate<ScrollView>(this);
  }
}
于 2013-03-05T12:19:26.123 回答