UPDATED
我之前的答案是使用 ItemsAdapter 设置每个项目的宽度,从代码设计的角度来看这不是最好的解决方案。
正确的方法是扩展 LinearLayoutManager,因为 LayoutManager 负责布局项目视图。
Gist: https://gist.github.com/modjke/b652021679a2ed1935645a18102ab799 https://gist.github.com/modjke/b652021679a2ed1935645a18102ab799
Code:
//usage:
//int itemsPerPage = 7;
//layoutManager = new LinearLayoutPagerManager(context, LinearLayoutManager.HORIZONTAL, false, itemsPerPage);
//recyclerView.setLayoutManager(layoutManager);
public class LinearLayoutPagerManager extends LinearLayoutManager {
private int mItemsPerPage;
public int getItemsPerPage()
{
return mItemsPerPage;
}
public LinearLayoutPagerManager(Context context, int orientation, boolean reverseLayout, int itemsPerPage) {
super(context, orientation, reverseLayout);
mItemsPerPage = itemsPerPage;
}
@Override
public boolean checkLayoutParams(RecyclerView.LayoutParams lp) {
return super.checkLayoutParams(lp) && lp.width == getItemSize();
}
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return setProperItemSize(super.generateDefaultLayoutParams());
}
@Override
public RecyclerView.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {
return setProperItemSize(super.generateLayoutParams(lp));
}
private RecyclerView.LayoutParams setProperItemSize(RecyclerView.LayoutParams lp) {
int itemSize = getItemSize();
if (getOrientation() == HORIZONTAL) {
lp.width = itemSize;
} else {
lp.height = itemSize;
}
return lp;
}
private int getItemSize() {
int pageSize = getOrientation() == HORIZONTAL ? getWidth() : getHeight();
return Math.round((float) pageSize / mItemsPerPage);
}
}
之前的回答
您可以通过为每个项目提供宽度来在适配器中设置准确的项目计数。仅当您的所有项目具有相同的宽度时,此功能才有效,不要忘记设置
recyclerView.setHasFixedSize(true);
在您的 RecyclerView 上
final static int ITEMS_PER_PAGE = 7;
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
int itemWidth = parent.getWidth() / ITEMS_PER_PAGE;
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.your_layout, parent, false);
ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams();
layoutParams.width = itemWidth;
itemView.setLayoutParams(layoutParams);
return new ItemViewHolder(itemView);
}