2

Android サンプル ( FixedGridLayout) の 1 つは、 を拡張しViewGroupて、新しい項目がグリッドに追加されたときのカスタム トランジションを可能にします。コードは期待どおりに機能しますが、スクロールは実装されていません。ScrollViewしたがって、これで問題が解決することを期待して、レイアウト全体をラップしました。ただし、FixedGridLayoutビューは実際には必要以上に大きく、アイテムの後にスクロール可能なスペースがたくさん残っているようです。

問題は onMeasure() の実装方法に関連していると思われます。私は正しいですか? もしそうなら、このコードの何が問題なのですか?

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int cellWidthSpec = MeasureSpec.makeMeasureSpec(mCellWidth, MeasureSpec.AT_MOST);
    int cellHeightSpec = MeasureSpec.makeMeasureSpec(mCellHeight, MeasureSpec.AT_MOST);

    int count = getChildCount();
    for (int index=0; index<count; index++) {
        final View child = getChildAt(index);
        child.measure(cellWidthSpec, cellHeightSpec);
    }

    // Use the size our parents gave us, but default to a minimum size to avoid
    // clipping transitioning children
    int minCount =  count > 3 ? count : 3;
    setMeasuredDimension(resolveSize(mCellWidth * minCount, widthMeasureSpec),
            resolveSize(mCellHeight * minCount, heightMeasureSpec));
}
4

1 に答える 1

0

ScrollView内部の子ビューを測定した後、垂直方向の高さのみを気にしますが、内部の子が高さを親よりも大きく設定しない限り、スクロールしません。

getHeight()内部ビューを呼び出して、予想よりも大きな値が計算されているかどうかを確認できます。このメソッドは、レイアウトが完了した後にのみ有効です。

あなたが投稿したコードには間違いがあるようです。

int minCount =  count > 3 ? count : 3;
setMeasuredDimension(resolveSize(mCellWidth * minCount, widthMeasureSpec),
        resolveSize(mCellHeight * minCount, heightMeasureSpec));

コードは、子の総数に基づいてwidthとを設定しています。グリッド レイアウト パターンを想定すると、幅は として計算され、高さは として計算されます。heightmCellWidth * columnsmCellHeight * rows

子の総数を使用して高さの値を設定すると、レイアウトの下部を超えてスクロールする理由が説明されます。

于 2013-06-02T01:25:13.933 に答える