检测项目在 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".
,这将不起作用
我怀疑我需要与布局管理器合作才能找到该信息,但不确定如何...
那么,有人知道我是如何做到这一点的吗?
您可以阅读每个 ViewHolder
的 GridLayoutManager.LayoutParams
,然后您将可以访问 getSpanIndex
和 getSpanSize
。
然而,这些值是在布局视图之后设置的,比 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 的实例中检索它。
我有一个 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".
我怀疑我需要与布局管理器合作才能找到该信息,但不确定如何...
那么,有人知道我是如何做到这一点的吗?
您可以阅读每个 ViewHolder
的 GridLayoutManager.LayoutParams
,然后您将可以访问 getSpanIndex
和 getSpanSize
。
然而,这些值是在布局视图之后设置的,比 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 的实例中检索它。