滚动(扩展)AdapterView时添加子视图

时间:2010-10-05 18:59:19

标签: android android-widget android-adapterview

我正在创建一个包含许多子视图的滚动面板(例如按钮)。每个子视图都有一个基于行和列索引的固定位置。我不能在开头创建它们,因为它们有很多,我会耗尽内存,所以我只想在与屏幕视图端口相交时添加子视图(当用户滚动到该区域时)。我用这样的东西覆盖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 :(得分:0)

没关系,我想你可以使用requestLayout()...

答案 1 :(得分:0)

您可能还想考虑使用ListView。它完全符合你的要求,这是它的元素的懒惰负载。有关详细信息,请参阅ListView上的Google IO会话。

简而言之,您要扩展的Adapter类具有View getView(int position, View convertView, ViewGroup parent)功能。可以覆盖此函数并检查convertView是否为null并加载,因为它实际上是以前创建的该子元素的视图。

还有关于避免findViewById()函数调用的其他细节,因为它很昂贵。