【问题标题】:RecyclerView Adapter - Where can you access item view after Layout?RecyclerView 适配器 - 布局后在哪里可以访问项目视图?
【发布时间】:2017-05-30 11:27:57
【问题描述】:
 onBindViewHolder 

是一种不错的方法,但有一个问题 - 视图还没有被测量。那么,如果我无法在视图上获得实际测量值,我可以在哪里调整 TextView 中的内容量等?如果 ItemView 与字符串长度相比具有一定的宽度,我想动态更改在 Item 视图中呈现的字符串的长度。我已经测量了 CharSet 长度等。没问题,但是如果我无法测量 View 的宽度,我怎么知道它是否太长?随着项目的发挥。字符串也可以在两个项目之间等。所以我至少需要知道我可以在哪里访问这种信息。谢谢。

【问题讨论】:

  • 可能你应该使用这样的东西:github.com/ViksaaSkool/AutoFitEditText 因为,在我看来,这应该由EditText 完成,而不是onBindViewHolder。根据文档onBindViewHolder - “由 RecyclerView 调用以在指定位置显示数据。”

标签: android android-layout


【解决方案1】:

您可以添加一个监听器来监听视图树的变化,并在完成测量后获取视图的宽度和高度。

final ViewTreeObserver obs = mTextView.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw () {
        int height = mTextView.getHeight();
        int width = mTextView.getWidth();

        // Return true to proceed with the current drawing pass, or false to cancel.
        return true;
   }
});

【讨论】:

  • 这就是我要找的。关于如何减少需要被调用的次数的任何建议?每次在回收站视图中都是一样的吗?这也是为里面的内容布局之后的措施吗?就像在给视图提供尺寸时考虑文本字符串一样?唯一担心的是它会被调用很多次......
  • @gitsensible 很确定它是在布局内容之后。由于您现在要做的是优化,因此在不知道您的适配器/布局是什么样的情况下很难提供答案。如果您的ViewHolder 基本相同,则您可以在第一次调用侦听器后缓存适配器中的宽度/高度。我建议先让您的应用运行,然后对其进行基准测试,然后再决定是否需要对其进行优化。
  • 好的,这是 TextView 的尺寸:TV.width=306 TV.measuredWidth =306 contentItem.MeasuredWidth=384 contentItem.width =384 TheSpannable.measuredWidth =159
  • 字符串有点长,测量值比: TV.width=312 TV.measuredWIdth =312 ItemView.MeasuredWidth=384 ItemView.Width=384 Spannable.measuredw=169 然而字符串是项目太长?好像169应该适合。我想这可能是一个网格布局。但是电视已经是 312 了,所以似乎足以应付 Scannable。字符串在 169 小节处被截断,或者另外几个字符可能是 5 或 6 个。
  • 我正在使用它来计算分配给电视的 Scannable 的尺寸:stackoverflow.com/questions/4245809/… - 也许它真的占用更多空间?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 2021-05-04
相关资源
最近更新 更多