android - 检测在 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;
就足够了。但如果不是所有项目都是“半角”,这将不起作用。
我怀疑我需要与布局管理器合作才能找到该信息,但不确定如何...
那么,有人看到我如何实现这一目标吗?
解决方案
您可以阅读GridLayoutManager.LayoutParams
每个ViewHolder
,然后您将可以访问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());
}
}
}
推荐阅读
- google-chrome-devtools - 使用 Chrome 开发者工具查看 DOM 源代码
- javascript - 用于编码 URL 的 Java 脚本和 Python 结果不一致
- ruby-on-rails - 在 Docker 中启动 sidekiq 时出错:“请将 sidekiq 指向 Rails 4/5 应用程序”
- c - `fgetc`、`fputc`、`fgets` 和 `fputs` 是否需要以文本模式打开的文件,而 `fread` 和 `fwrite` 需要以二进制模式打开的文件?
- azure - Azure 资源管理器 - 无法在访问策略中使用 Microsoft 应用服务部署 Keyvault
- python - 在 python PIL 中缩放和裁剪图像而不超出图像尺寸
- sql - 在同一查询中求和并连接列数据
- php - 从前端发布时,WordPress get_the_post_thumbnail_url() 不起作用
- javascript - CORS/JavaScript/Laravel:向 Digital Ocean 服务器发送请求并接收数据(标题问题)
- python - 光栅:ValueError:宽度和高度必须> 0