2013-02-24 44 views
1

我有一個自定義視圖,基本上看起來像按鈕的GridView。 gridview從沒有孩子開始,每次用戶按下按鈕時,都會添加另一個自定義視圖。GridView的孩子有時不繪圖

這有一些奇怪的行爲。我在onDraw中的自定義視圖上繪製文本,線條等東西,有時甚至會繪製它們。它們完全空白。在哪些視圖顯示或不顯示繪製的圖形方面,行爲似乎非常隨意。

我有一種感覺,這是與我做設置layoutparameters。我將子視圖存儲在一個數組中,並在getView()中返回與位置參數相關的視圖。所以我只爲每個職位創建過一次按鈕。

所以我有兩個問題。

  1. 我在做什麼導致這種情況?

  2. 我應該甚至使用gridview來做我正在做的事情嗎?

爲可查看該代碼:

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     GridButton button; 
     GridView gridView = (GridView)parent; 
     if(childBuittons.size() <= position) //if we need to create a new button 
     { 
       button = createButton(position); 
       int nWidth = getButtonSize(gridView); 
       GridView.LayoutParams params = new GridView.LayoutParams(nWidth, nWidth); 
       button.setLayoutParams(params); 
     } 
     else //we already have a button that we created 
     { 
      button = buttons.get(position); 
     } 
     return button; 
    } 

一些更多的信息: - 該gridbutton類只是一個擴展查看和覆蓋的onDraw畫一些圖形,如文本和線條 類 - 即時通訊試圖實現的是用戶可以添加或刪除的正方形網格(儘管它們不會經常這樣做),然後按方塊來執行某些功能 - 可能會有更多的正方形比可以放入屏幕

回答

0

我在做什麼來造成這種情況?

沒有提供有關GridButton類的更多細節,沒有人能真正幫助您。很高興知道你如何處理視圖的測量,以及你在該視圖中究竟是如何(以及如何)繪製的。

我有一種感覺,這是與我做設置layoutparameters。

我對此表示懷疑。爲了確保您也可以在該自定義視圖中繪製一個簡單的顏色,並查看它是否出現在網格上。如果是這樣,LayoutParams不是發生什麼的原因。同時檢查你得到的值爲nWidth

一旦創建了子視圖,我將它們存儲在一個數組中,並在 getView()中返回與位置參數相關的視圖。所以我 只爲每個位置創建按鈕一次。

這並不好。使用GridView的主要原因是您可以使用其適配器來避免必須事先創建所有網格視圖(佔用內存(如果不是崩潰)並放慢您的應用程序)。您應該考慮實施適用於GridView/ListView的適當回收機制。你getView()方法應該是這樣的:

View getView(int position, View convertView, ViewGroup parent) { 
    GridButton button; 
    GridView gridView = (GridView)parent; 
    if(convertView == null) { 
      button = createButton(position); 
      int nWidth = getButtonSize(gridView); 
      GridView.LayoutParams params = new GridView.LayoutParams(nWidth, nWidth); 
      button.setLayoutParams(params); 
    } else { 
     button = (GridButton) convertView; 
    } 
    return button; 
} 

如果您需要訪問這些按鈕,然後通過適配器訪問它們,改變根據按鈕的位置,並呼籲notifyDataSetChanged()一些數據。

我應該甚至使用gridview來做我正在做的事情嗎?

你沒有說你想做什麼。如果您認爲單元的數量足夠高並且預計不會看到所有單元,請使用GridView。如果您認爲所有單元格都可見,那麼您可以使用標準佈局製作網格,而不需要GridView

+0

感謝您的回覆。我更新了我的問題,希望能提供更多信息。我理解整個回收事件(或者我不知道) - 我只是認爲返回已經創建並存儲並設置的視圖會更有效率,而不是每次都重新初始化該視圖。 – gcb 2013-02-24 16:14:16

+0

@gcb 'GridView'的回收機制綽綽有餘(以及處理事物的推薦方式)。如果你還沒有解決這個問題,也許你可以發佈自定義視圖的'onDraw方法。 – Luksprog 2013-02-28 11:33:19

+0

實際上,我決定嘗試一個gridlayout,它對於我想要做什麼並且完美地工作更有意義。 – gcb 2013-03-01 12:37:39