RecyclerView LinearLayoutManager设置项目数

Por*_*rio 1 android android-recyclerview

在GridLayoutManager中,我可以设置跨度计数,这使得视图内的项目可以调整大小以能够水平适应该跨度计数。

我有一个LinearLayoutManager,我想以相同的方式使用它,有固定数量的可见项目,并调整它们的大小以适合。

我在同一视图上同时使用线性和网格,并根据屏幕尺寸显示项目。我似乎找不到一种使两种布局显示相同数量的项目的方法。

Mih*_*iev 5

更新

我以前的答案是使用ItemsAdapter设置每个项目的宽度,从代码设计的角度来看,这不是最佳解决方案。正确的方法是扩展LinearLayoutManager,因为LayoutManager负责布局项目视图。

要点:https : //gist.github.com/modjke/b652021679a2ed1935645a18102ab799

码:

//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);
}
Run Code Online (Sandbox Code Playgroud)

}

上一个答案

您可以通过为每个项目提供宽度来在适配器中设置确切的项目数。仅当所有商品的宽度相等时,此功能才起作用,请不要忘记设置

recyclerView.setHasFixedSize(true);
Run Code Online (Sandbox Code Playgroud)

在您的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);
}
Run Code Online (Sandbox Code Playgroud)