RecyclerView LinearLayoutManager设置项计数

问题描述 投票:1回答:3

在GridLayoutManager我能够设置跨度数和,使视图内的项目调整,以便能够以水平方向完全跨越计数。

我有一个LinearLayoutManager,我想用同样的方式,有一个项目的固定数量的可见光和调整它们的大小以适应。

我用相同的视图线性和网格,并显示根据屏幕尺寸的物品。我似乎无法找到一个办法让这两种布局显示物品的量相同。

android android-recyclerview
3个回答
4
投票

更新

我以前的答案是使用ItemsAdapter设置每个项目的宽度,从代码设计的立场来看,这不是最好的解决办法。正确的方式做到这一点是延长LinearLayoutManager,因为它是布局管理责任版面项目的意见。

要点: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);
}

}

以前的答案

您可以通过为每个项目提供的宽度设定在适配器确切的项目数。这只有当所有的项目具有相同的宽度,不要忘记设置

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);
}

1
投票

我知道这是问前一段时间,但我已经找到了一个更简单的解决方案。

只要创建自己的布局管理,并覆盖方法getChildCount()

结果应该是这样的:

@Override
public int getChildCount() {
   return super.getChildCount() > 3 ? 3 : super.getChildCount();
}

这样,当您添加此布局管理到Recyclerview,它只是一次显示3个项目,无论适配器多少项目了。

而且,如果你想般的体验寻呼机滚动时只需添加一个SnapHelper

SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(mRecyclerView);

0
投票

这里是米哈伊尔·伊格纳季耶夫的答案的科特林版本

class LinearLayoutPagerManager(context: Context,orientation: Int,reverseLayout: Boolean, private val itemsPerPage: Int) : LinearLayoutManager(context,orientation,reverseLayout) {

    override fun checkLayoutParams(lp: RecyclerView.LayoutParams?): Boolean {
        return super.checkLayoutParams(lp) && lp!!.width == getItemSize()
    }

    override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams {
        return setProperItemSize(super.generateDefaultLayoutParams())
    }

    override fun generateLayoutParams(lp: ViewGroup.LayoutParams): RecyclerView.LayoutParams {
        return setProperItemSize(super.generateLayoutParams(lp))
    }

    private fun setProperItemSize(lp: RecyclerView.LayoutParams): RecyclerView.LayoutParams {
        val itemSize = getItemSize()
        if (orientation == LinearLayoutManager.HORIZONTAL) {
            lp.width = itemSize
        } else {
            lp.height = itemSize
        }
        return lp
    }

    private fun getItemSize(): Int {
        val pageSize = if (orientation == LinearLayoutManager.HORIZONTAL) width else height
        return Math.round(pageSize.toFloat() / itemsPerPage)
    }


}
© www.soinside.com 2019 - 2024. All rights reserved.