Добавление дочерних представлений при прокрутке в (расширенном) AdapterView - PullRequest
1 голос
/ 05 октября 2010

Я создаю панель прокрутки со многими дочерними представлениями (например, кнопками). Каждое дочернее представление имеет фиксированное местоположение на основе индекса строки и столбца. Я не могу создать их в начале, так как их много, и у меня не хватит памяти, поэтому я бы хотел добавить дочернее представление только тогда, когда оно пересекается с портом представления экрана (когда пользователи прокручивают эту область). Я переопределяю метод onLayout () примерно так:

@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 при прокрутке пользователя?

Ответы [ 2 ]

0 голосов
/ 06 октября 2010

Вы также можете рассмотреть возможность использования ListView. Он делает именно то, что вы хотите, то есть ленивый груз своих элементов. Подробнее см. Сеанс Google IO на ListView .

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

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

0 голосов
/ 06 октября 2010

Не бери в голову, я подумал, что вы можете использовать requestLayout () ...

...