我有一个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()
方法中)该项目是在左侧还是在右侧,以防它是“半角”项目。
如果所有项目都是“半角”项目,那将是微不足道的。一个简单的验证boolean buttonIsOnTheLeft = position % 2 == 0;
就足够了。但是,如果不是所有项目都是“半角宽度”,这将不起作用。
我怀疑我需要与布局管理器一起找到该信息,但不确定如何...
那么,有人在看我如何实现这一目标吗?
答案 0 :(得分:1)
您可以阅读每个ViewHolder
的{{3}},然后才能访问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());
}
}
}
答案 1 :(得分:0)
我找到了解决方案。在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实例中检索了该方法。