3

これまで recyclerView を作成しようとしてきましたが、今問題に直面しています。

こんな感じにすればいいのに

ここに画像の説明を入力

リストのようにグリッドにする必要がありますが、並べて配置することはできません。

次に、最後のアイテムが「単独」の場合、両方のスペースを埋める最後のアイテムが必要です。

何か案は?

4

2 に答える 2

2

グリッドのようなリストにする必要があります

を使用RecyclerViewして実現できGridLayoutManagerます。例えば、

// Initialize the view
recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
// Here 2 is the number of columns
GridLayoutManager llm = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(llm);
recyclerView.setHasFixedSize(true);

最後のアイテムが「単独」の場合、両方のスペースを埋めるために最後のアイテムが必要です

グリッド項目をカスタマイズするには、 を使用できますItemDecoration。そしてあなたの場合、それが単独である場合、最後のアイテムには親の幅が必要です。これは、最後のアイテムの位置を確認することで実現できます。

さて、コード:

活動中

recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
GridLayoutManager llm = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(llm);
recyclerView.setHasFixedSize(true);
recyclerView.addItemDecoration(new GridItemDecoration());
// And set adapter

GridItemDecoration.java

public class GridItemDecoration extends RecyclerView.ItemDecoration
{
    private int mHorizontalSpacing = 10;
    private int mVerticalSpacing = 10;

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
    {
        super.getItemOffsets(outRect, view, parent, state);
        // Only handle the vertical situation
        int position = parent.getChildPosition(view);
        if (parent.getLayoutManager() instanceof GridLayoutManager)
        {
            GridLayoutManager layoutManager = (GridLayoutManager) parent.getLayoutManager();
            int spanCount, column;
            // Check the last item and is alone. Then set the parent's width
            if (position == parent.getAdapter().getItemCount() - 1 && position % 2 == 0)
            {
                spanCount = 1;
                outRect.left = mHorizontalSpacing;
                outRect.right = parent.getWidth() - mHorizontalSpacing;
            }
            else
            {
                spanCount = layoutManager.getSpanCount();
                column = position % spanCount;
                outRect.left = mHorizontalSpacing * (spanCount - column) / spanCount;
                outRect.right = mHorizontalSpacing * (column + 1) / spanCount;
            }

            if (position < spanCount)
            {
                outRect.top = mVerticalSpacing;
            }
            outRect.bottom = mVerticalSpacing;
        }
    }
}
于 2016-01-18T14:16:01.023 に答える