これまで recyclerView を作成しようとしてきましたが、今問題に直面しています。
こんな感じにすればいいのに
リストのようにグリッドにする必要がありますが、並べて配置することはできません。
次に、最後のアイテムが「単独」の場合、両方のスペースを埋める最後のアイテムが必要です。
何か案は?
これまで recyclerView を作成しようとしてきましたが、今問題に直面しています。
こんな感じにすればいいのに
リストのようにグリッドにする必要がありますが、並べて配置することはできません。
次に、最後のアイテムが「単独」の場合、両方のスペースを埋める最後のアイテムが必要です。
何か案は?
グリッドのようなリストにする必要があります
を使用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;
}
}
}