2010-11-15 15 views
1

我需要遞歸地移動通過擴展視圖類的一堆自定義視圖。Android是指循環中的自定義視圖?

E.g.

ViewOne.java 
ViewTwo.java 
ViewThree.java 

我在MainClass.java

ViewOne vOne; 
ViewTwo vTwo; 
ViewThree vThree; 

這些意見都實現了一個名爲start()功能創建的每個視圖的實例。

,我希望能夠遍歷它們以某種方式:

for(int i=0; i<= 2:i++) 
{ 
    views[i].start(); 
} 

我怎麼會去這樣做呢?

以上只是一個例子。我需要能夠以數字和編程方式移動它們的真正原因是因爲我希望能夠按照按鈕(上一個和下一個)單擊的方式,按照數字順序添加視圖並將其刪除。 (我不希望它們一開始就添加到佈局中,因爲它們佔用大量資源)。

那麼所需要的是這樣:

點擊下一步 - >添加下一個視圖 - >刪除當前視圖。 單擊上一個 - >添加上一個視圖 - >刪除當前視圖。

例如

currView = 1 

Current View is currView (1) 
Click Next 
Add View currView+1 (2) to Layout 
Switch to View currView+1 (2) 
Remove View currView (1) 

or 

currView = 2 

Current View is currView (2) 
Click Previous 
Add View currView-1 (1) to Layout 
Switch to currView-1 (1) 
remove View currView (2) 

注意,這種觀點都是自己獨特的類型,並且是擴展查看INFACT個人類。我不能簡單地將它們轉換爲「View」,因爲這是錯誤的,它們的類型分別是ViewOne,ViewTwo和ViewThree(例如)。

回答

0

如果你想這樣做,我會列出視圖和循環通過這個列表。例如:

List views = new ArrayList(); 
views.add(vOne); 
views.add(vTwo); 
views.add(vThree); 

for (View view: views) { 
view.start(); 
} 
+0

謝謝,我現在就試試這個。然而,如果我將所有的視圖添加到這個列表中,他們的構造函數會被調用(每個視圖的構造函數會加載十幾個位圖資源),但我關心內存。 – Hamid 2010-11-15 14:07:52

+0

您應該在將視圖添加到列表之前實例化視圖。是的,如果你實例化一個視圖,構造函數被調用。 – 2010-11-15 14:18:32

+0

這似乎不工作,除非我typecase查看我的自定義視圖之一。 (ViewOne)或(ViewTwo)或(ViewThree)。否則它只會返回標準(View)類型的函數供我調用。 – Hamid 2010-11-15 14:20:30

3

假設所有的意見都被添加到佈局,您可以通過編程遍歷所有的ViewGroup中的兒童(即佈局),像這樣:

ViewGroup group = findViewById(R.id.root); // The name of your layout 
int children = group.getChildCount(); 
for (int i = 0; i < children; i++) { 

    View child = group.getChildAt(i); 
    if (child instanceof ViewOne) {   
     ... 
    } else if (child instanceof ViewTwo) { 
     ... 
    } 
} 

此外,如果您的所有自定義視圖都實現了start(),我會將該方法推入界面,以便簡化上面的if塊。

+0

其實,它們還沒有被添加到佈局中,我重複它們的原因是我希望在需要時爲佈局添加視圖。我有大約30個視圖,每個視圖加載20個位圖。由於內存問題,我不希望它們在佈局前加載到佈局中。 – Hamid 2010-11-15 15:26:11

+0

這確實使事情變得複雜一點。我會在您的問題中添加其他信息。 – 2010-11-15 15:30:04

+0

我想象如此,因此我在看到你的答覆之前就更新了這個問題。 – Hamid 2010-11-15 15:54:12

0

因爲你試圖推遲你的意見的建設,我建議你使用Builder模式。按您的示例創建一個接口Builder並導出三個子類:

public class BuildViewOne implements Builder { 
    ... 
    public View start() { return new ViewOne(); } 
} 

public class BuildViewTwo implements Builder { 
    ... 
    public View start() { return new ViewTwo(); } 
} 

public class BuildViewThree implements Builder { 
    ... 
    public View start() { return new ViewThree(); } 
} 

Builder該接口具有其產生在需要時將僅加載這些資源中的相應視圖的開始方法。然後,創建視圖的建設者正是如此的數組:

Builder builders[] = new Builder[] { 
    new BuildViewOne(), 
    new BuildViewTwo(), 
    new BuildViewThree() 
} 

現在,你可以通過它的索引builders[2].start()創建一個實例的類。根據您的問題,您還可以將創建的視圖與構建器一起緩存,以允許您執行將破壞視圖的stop()方法。因此,當您從佈局中移除視圖時,您可以釋放資源(我假設您只需要一個給定視圖的一個實例)。

注:以上不是真正的代碼(即我沒有編譯或運行它)。

+0

謝謝。你的假設是正確的,我只需要每個視圖的一個實例,是的,我需要在最後銷燬它們,以及在其間調用各種其他功能。我會稍後再看看這些結果並回傳。附:在我的情況下,start()並不是簡單地說明視圖上的實例化,而是實際上調用了一個將在視圖中開始的定時器的函數調用。 – Hamid 2010-11-16 07:50:01

+0

聽起來像使用中間對象來實例化,啓動,刪除並將其他調用傳遞給實際視圖可以滿足您的需求。 Builder可能不是最好的比喻,那麼Proxy可能是更好的方式來思考它。 – 2010-11-16 16:00:14