RecyclerView LinearLayoutManager设置项目计数

时间:2016-04-14 22:56:59

标签: android android-recyclerview

在GridLayoutManager中,我可以设置跨度计数,并使视图中的项目可以调整大小,以便能够横向调整跨度计数。

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

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

3 个答案:

答案 0 :(得分:4)

已更新

我之前的回答是使用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);
}

}

以前的答案

您可以通过为每个项目提供宽度来设置适配器中的确切项目数。仅当所有项目的宽度相等时才有效,不要忘记设置

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 :(得分:0)

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

只需创建自己的LayoutManager并覆盖方法getChildCount()

结果应该是这样的:

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

这样,当您将此LayoutManager添加到Recyclerview时,无论适配器有多少个项目,它一次仅显示3个项目。

而且,如果您希望在滚动时获得类似寻呼机的体验,只需添加SnapHelper

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

答案 2 :(得分:0)

这是Mihail Ignatiev的答案的kotlin版本

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


}