首页 > 解决方案 > 检测在 RecyclerView 中呈现项目的列

问题描述

我有一个RecyclerView使用 aGridLayoutManager来呈现我的数据集。

布局管理器的spanCount值为 2,但我设置了 a SpanSizeLookup,因此我可以将一些项目显示为行 (spanSize=2),而其他项目仅占一半宽度 (spanSize=1)。

layoutManager = new GridLayoutManager(this.getContext(), 2);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
   @Override
   public int getSpanSize(int position) {
       return getSpanSizeByPosition(position);
   }
});

现在我需要检测(onBindViewHolder()如果可能,在适配器方法中)该项目是否将呈现在左侧或右侧,以防它是“半角”项目。

如果所有项目都是“半角”项目,那将是微不足道的。一个简单的验证boolean buttonIsOnTheLeft = position % 2 == 0;就足够了。但如果不是所有项目都是“半角”,这将不起作用。

我怀疑我需要与布局管理器合作才能找到该信息,但不确定如何...

那么,有人看到我如何实现这一目标吗?

标签: androidandroid-recyclerviewgridlayoutmanager

解决方案


您可以阅读GridLayoutManager.LayoutParams每个ViewHolder,然后您将可以访问getSpanIndexgetSpanSize

然而,这些值是在视图布局之后设置的,这比onBindViewHolder(). 此事件的回调是onViewAttachedToWindow(RecyclerView.ViewHolder holder)方法:

class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    // ... 

    @Override
    public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) {
        if(holder.itemView.getLayoutParams() instanceof GridLayoutManager.LayoutParams){
            GridLayoutManager.LayoutParams lp = (GridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();
            holder.title.setText("In column "+lp.getSpanIndex()+", size "+lp.getSpanSize());
        }
    }
}

推荐阅读