2013-03-05 1 views
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 и быть таким же. Я, конечно, можно просто скопировать весь блок и изменить расширяет HorizontalScrolView к расширяет ScrollView, а затем (L, 0) в (0, L) (ой, это была ошибка при публикации на SO, конечно, что строка не изменится, GetCurrentPos будет).java sugaring, можно ли избежать почти дублирования кода здесь?

или я могу добавить свойство «bool vertical». Но у Java нет шаблонов или макросов или прототипов времени исполнения, так есть ли другой способ на Java, чтобы избежать дублирования кода в этом примере?

+1

Имейте общий базовый класс и выведите вертикальный класс и горизонтальный класс. Либо с параметрической ориентацией конструктора (à la swing), либо переопределением. –

+1

Если вы вывели VSV-класс из HSV. Вы можете просто переопределить метод addView пустым методом. Возможно, вам следует сначала извлечь его в другой метод, а затем переопределить. –

+2

Я бы остался с этими двумя классами. Вы сделаете свой код более сложным и сложным для отладки при попытке объединить их. И время, думая об этом, не стоит нескольких простых чисел кода, которые вы сохраняете. – Kai

ответ

2

Глядя на документацию для android.widget.ScrollView и android.widget.HorizontalScrollView, оба из них, кажется, реализовать

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); 
    } 
} 
+0

Но что такое вещь? Это похоже на C++-шаблон, я имею в виду те <> и Т. Но как насчет «Java не поддерживает шаблонов»? – exebook

+1

В настоящее время Java имеет общие классы для нескольких версий, которые похожи на шаблоны C++, поскольку 'LinkedList <>' может быть «LinkedList » или «LinkedList », как и шаблонные шаблоны C++ – Patashu

+0

Java-дженерики существуют для почти 10 лет. – jahroy

 Смежные вопросы

  • Нет связанных вопросов^_^