0

動的グリッド方式で子ビューを表示するカスタム レイアウトを作成しようとしています。pinterest のようなものですが、まだそこまでは行っていません。

これが私のレイアウトクラスですPostsLayout

    /**
     * Displays Post records in different sizes.
     */
    public class PostsLayout extends RelativeLayout
    {
        private class PostPos
        {
            public Button   view;
            public int      Row;
            public int      RowSpan;
            public int      Column;
            public int      ColSpan;
            public int      Size;

            public PostPos(Context context, int row, int row_span, int column, int col_span)
            {
                view = new Button(context);
                view.setText("btn");

                Row = row;
                RowSpan = row_span;
                Column = column;
                ColSpan = col_span;
            }

            public void update(int size)
            {
                Size = size;

                RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(size, size);
                lp.leftMargin = size * Column;
                lp.topMargin = size * Row;
                view.setLayoutParams(lp);
            }
        }

        private ArrayList<PostPos>  _posts;

        /**
         * The number of columns.
         */
        private int                 _columns;

        /**
         * Constructor.
         * 
         * @param context
         */
        public PostsLayout(Context context, int columns)
        {
            super(context);

            _posts = new ArrayList<PostPos>();

            _columns = columns;
            int rows = 3;

            for (int r = 0; r < rows; r++)
            {
                for (int c = 0; c < _columns; c++)
                {
                    PostPos pp = new PostPos(context, r, 1, c, 1);
                    _posts.add(pp);
                    addView(pp.view);
                }
            }
        }

        @Override
        protected void onSizeChanged(int width, int height, int old_width, int old_height)
        {
            for (PostPos pos : _posts)
            {
                pos.update(width / _columns);
            }

            super.onSizeChanged(width, height, old_width, old_height);
        }
    }

このレイアウトを使用すると、ビューを埋める 3x3 ボタンのグリッドが表示されます。それが欲しかったのですが、スクロールしません。だから私は a を使おうとしましたScrollViewが、それをするとすべてが消えます。ビューはただ空白です。

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    ScrollView scroll = new ScrollView(this);
    ScrollView.LayoutParams params = new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT, ScrollView.LayoutParams.WRAP_CONTENT);
    scroll.setLayoutParams(params);

    PostsLayout posts = new PostsLayout(this, 4);
    scroll.addView(posts);

    setContentView(scroll);
}

何が問題なのかわかりません。

編集:

コンストラクターを変更してPostsLayout、デフォルトで 1 つのボタンを作成するだけで、そのボタンがScrollView. したがって、他のボタンで何か間違ったことをしているに違いありません。

これがコードです。

        public PostsLayout(Context context, int columns)
        {
            super(context);

            _posts = new ArrayList<PostPos>();

            _columns = columns;
            int rows = 3;

            for (int r = 0; r < rows; r++)
            {
                for (int c = 0; c < _columns; c++)
                {
                    //PostPos pp = new PostPos(context, r, 1, c, 1);
                    //_posts.add(pp);
                    //addView(pp.view);
                }
            }

            // this button does show!?!?
            addView(new Button(context));

            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            this.setLayoutParams(params);
        }

編集:

onSizeChanged間違った値で呼び出されました。がない場合はScrollViewPostsLayoutデバイスのフル サイズに合わせてサイズ変更されますが、 がある場合はScrollViewonSizeChangedメソッドが非常に小さいサイズ値で呼び出されます。これが、デバイスに何も表示されない理由です。

これをコンストラクターに追加しましたPostsLayoutが、修正されませんでした。

            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            this.setLayoutParams(params);
4

1 に答える 1