2010-10-05 61 views
1

我正在創建一個包含許多子視圖(例如按鈕)的滾動面板。每個子視圖都有一個基於行列索引的固定位置。我不能在開始時創建它們,因爲它們有很多,並且我的內存不足,所以我只想在與屏幕視圖端口相交的時候添加子視圖(當用戶滾動到該區域時)。餘像這樣的東西覆蓋onLayout()方法:滾動時添加子視圖(擴展後)AdapterView

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    super.onLayout(changed, l, t, r, b); 
    for (int row = 0; row < ROW_NUM; row++) { 
     ColumnAdapter columnAdapter = mRowAdapter.getItem(row); 
     for (int col = 0; col < COLUMN_NUM; col++) { 
      ItemView itemView = columnAdapter.getView(col, null, this); 
      if (isOnScreen(row, col)) { 
       itemView.layout(col * 100, row * 100, (col + 1) * 100, (row + 1) * 100); 
       addViewInLayout(itemView, row + col, null, true); 
      } 
     } 
    } 
    scrollTo(getScrollX(), getScrollY()); 
} 

(ColumnAdapter是適配器延伸和ItemView控件是按鈕擴展名)。這是行不通的,因爲在滾動期間不調用onLayout()。我應該怎麼做,以用戶滾動動態添加ItemViews?

回答

0

別介意我想,你可以使用requestLayout()...

0

您可能還需要考慮使用一個ListView。它正是你想要的,這是它的元素的延遲加載。有關詳細信息,請參閱ListView上的Google IO會話。

總之,您正在擴展的Adapter類具有View getView(int position, View convertView, ViewGroup parent)函數。這個函數可以被覆蓋,並且檢查convertView是否爲空並且加載它,因爲它實際上是以前創建的那個子元素的視圖。

還有關於避免findViewById()函數調用的其他細節,因爲它很昂貴。

+0

嗨諾埃爾,謝謝你的迴應。我很喜歡使用ListView,除了我創建的小部件包含許多可以一起滾動的列,而ListView則分別處理它們自己的滾動。 – 2010-10-07 16:32:31