开发者

Add child views when scrolling in (extened) AdapterView

I am creating a scrolling panel with many child views (e.g开发者_如何学JAVA. buttons). Each child view has a fixed location based on their row and column index. I cannot create them at the beginning since there are tons of them and I will run out of memory, so I'd like to only add a child view when it intersects with the screen view port (when users scrolls to that area). I override the onLayout() method with something like this:

@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 is an Adapter extension and ItemView is button extension). This wouldn't work because onLayout() is not called during scrolling. What should I do to add ItemViews dynamically as user scrolls?


Never mind I figured that you can use requestLayout()...


You may also want to consider using a ListView. It does exactly what you want, that is a lazy load of its elements. See the Google IO session on ListView for details.

In short, the Adapter class you are extending has a View getView(int position, View convertView, ViewGroup parent) function. This function can be overriden and doing a check to see if convertView is not null and loading that since it is actually a previously created View of that child element.

There are also additional details on avoiding the findViewById() function call since it is expensive.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜