检测在RecyclerView中呈现项目的列

时间:2018-11-19 16:12:39

标签: android android-recyclerview gridlayoutmanager

我有一个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;就足够了。但是,如果不是所有项目都是“半角宽度”,这将不起作用。

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

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

2 个答案:

答案 0 :(得分:1)

您可以阅读每个ViewHolder的{​​{3}},然后才能访问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());
        }
    }
}

答案 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实例中检索了该方法。