检测项目在 RecyclerView 中呈现的列

Detect column where the item is rendered in a RecyclerView

我有一个 RecyclerView 使用 GridLayoutManager 渲染我的数据集。

布局管理器的 spanCount 是 2,但我设置了 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() 方法中)该项目是在左侧还是右侧呈现,以防它是 "half-width" 项目。

如果所有项目都是 "half-width" 项,那将是微不足道的。一个简单的验证 boolean buttonIsOnTheLeft = position % 2 == 0; 就足够了。但是,如果不是所有项目都是 "half-width".

,这将不起作用

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

那么,有人知道我是如何做到这一点的吗?

您可以阅读每个 ViewHolderGridLayoutManager.LayoutParams,然后您将可以访问 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());
        }
    }
}

我找到了解决方案。在 onBindViewHolder() 方法中,我只需要调用我实现的这个方法:

private boolean isButtonIsOnTheLeft(int position, NodeStructureTreeViewAdapter adapter) {
        GridLayoutManager layoutManager = adapter.getLayoutManager();
        int spanIndex = layoutManager.getSpanSizeLookup().getSpanIndex(position, layoutManager.getSpanCount());
        return spanIndex == 0;
}

当然,我在我的适配器中实现了方法 getLayoutManager(),并从 recyclerView 的实例中检索它。