addOnPreDrawListener()的在recycleView中使用的坑

2022-06-25 10:53:17 浏览数 (1)

addOnPreDrawListener()在recycleView的item中使用时,即使使用removeOnPreDrawListener(this),但是onPreDraw()还是会被不断调用,阻塞ui线程。

代码语言:javascript复制
approveTextView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                if(isFirst) {
                    try {
                        if(approveTextView.getViewTreeObserver().isAlive()) {
                            approveTextView.getViewTreeObserver().removeOnPreDrawListener(this);
                            isFirst = false;
                        }
                        int nameWidth = nameView.getMeasuredWidth();
                        ...
                    }catch (Throwable t){
                        t.printStackTrace();
                    }
                }
                return true;
            }
        });

解决办法一: 加isFirst进行判断,如上; 解决办法二: 换用其他得到view宽度的方法:

代码语言:javascript复制
approveTextView.post(new Runnable() {
            @Override
            public void run() {
                try {
                    int nameWidth = nameView.getMeasuredWidth();
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            }
        });

0 人点赞