2010-10-05 3 views
1

Я создаю панель прокрутки со многими дочерними представлениями (например, кнопки). Каждое дочернее представление имеет фиксированное местоположение на основе индекса строки и столбца. Я не могу создать их в начале, так как их много, и у меня не хватит памяти, поэтому я бы хотел добавить дочерний вид, когда он пересекается с портом просмотра экрана (когда пользователи прокручиваются до этой области). Я переопределить метод OnLayout() с чем-то вроде этого:Добавить дочерние представления при прокрутке в (extened) 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. Он делает именно то, что вы хотите, это ленивая нагрузка его элементов. Подробнее см. В сеансе Google IO по телефону ListView.

Короче говоря, класс адаптера, который вы распространяете, имеет функцию View getView(int position, View convertView, ViewGroup parent). Эта функция может быть переопределена и выполняется проверка, чтобы убедиться, что convertView не является нулевым и загружает его, поскольку он фактически является ранее созданным представлением этого дочернего элемента.

Есть также дополнительная информация об избежании вызова функции findViewById(), поскольку это дорого.

+0

Hi Noel, спасибо за ответ. Я бы хотел использовать ListView, кроме того, что виджет, который я создаю, содержит много столбцов, которые могут прокручиваться вместе, а ListView обрабатывает их собственную прокрутку по отдельности. –