[BUG]RecyclerView的item中TextView使用getViewTreeObserver().addOnGlobalLayoutListener方法获取getHeight值

BUG记录,最近遇到的一个问题(尚未解决)

[BUG]RecyclerView的item中TextView使用getViewTreeObserver().addOnGlobalLayoutListener方法获取getHeight值,在进行下拉刷新后(rv中list的数据没有改变),getHeight(getMeasuredHeight)值会发生变化,导致TextView不能正常展开
动态展开折叠TextView内容,展开显示所有内容,默认显示3行,holder代码如下
@Override
protected void onRefreshView(GameDetailBean.Type1Bean bean, int position) {
        //内容
        mTvContent.setText("内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容");
        ImageLoadUtil.showImage(context, "", mIvIcon);
        mTvTitle.setText("游戏标题");
        mTvPlayer.setText("游戏类型丨5837人在玩");
        mTvTime.setText("日期:2017-07-17");
        //预览图片
        ArrayList<ImageBean> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(new ImageBean());
        }
        mRvImage.setLayoutManager(new LinearLayoutManager(context,
                LinearLayoutManager.HORIZONTAL, false));
        //每次刷新时,必须设置监听为null
        mRvImage.setOnFlingListener(null);
        StartSnapHelper startSnapHelper = new StartSnapHelper();
        startSnapHelper.attachToRecyclerView(mRvImage);
        ImageAdapter imageAdapter = new ImageAdapter(list);
        mRvImage.setAdapter(imageAdapter);
        mTvContent.getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        mTvContent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        mTotalHeight = mTvContent.getMeasuredHeight();
                        mThreeLineHeight = mTvContent.getLineHeight() * 3
                                + mTvContent.getPaddingTop()
                                + mTvContent.getPaddingBottom()
                                + 2;
                        //将高度设置为3行的高度
                        ViewGroup.LayoutParams layoutParams = mTvContent.getLayoutParams();
                        layoutParams.height = mThreeLineHeight;
                        mTvContent.setLayoutParams(layoutParams);
                    }
                });
        mIvContent.setRotation(0);
        mIsOpened = false;
        mIvContent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                toggle(mTvContent, mIvContent);
            }
        });
    }

    private void toggle(final TextView tv, final ImageView iv) {
        iv.setEnabled(false);
        if (mIsOpened) {
            mHeightAnim = new HeightAnim(tv, mTotalHeight, mThreeLineHeight);
        } else {
            mHeightAnim = new HeightAnim(tv, mThreeLineHeight, mTotalHeight);
        }
        mIsOpened = !mIsOpened;
        mHeightAnim.setHeightAnimListener(new HeightAnim.HeightAnimListener() {
            @Override
            public void onUpdate(int value) {

            }

            @Override
            public void onAnimationStart() {
                ViewCompat.animate(iv).rotationBy(180).setDuration(300).start();
            }

            @Override
            public void onAnimationEnd() {
                iv.setEnabled(true);
            }
        });
        mHeightAnim.startAnim(300);
    }
  

下拉刷新代码(模拟从网络获取)

 private void doNetWorkRequest() {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new GameDetailBean.Type1Bean());
        arrayList.add(new GameDetailBean.Type2Bean());
        mAdapter.setNewData(arrayList);
 }

当我写完这段代码时,感觉需求问题就已经解决了,但是在下拉刷新后就出现了问题

进行下拉刷新后,点击右下角的小箭头,TextView不能正常的展开了

在这里插入图片描述

发现问题时出现在

        mTvContent.getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        mTvContent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        
                        //获取tv的高度值发生了变化
                        mTotalHeight = mTvContent.getMeasuredHeight();
                        
                        mThreeLineHeight = mTvContent.getLineHeight() * 3
                                + mTvContent.getPaddingTop()
                                + mTvContent.getPaddingBottom()
                                + 2;
                        //将高度设置为3行的高度
                        ViewGroup.LayoutParams layoutParams = mTvContent.getLayoutParams();
                        layoutParams.height = mThreeLineHeight;
                        mTvContent.setLayoutParams(layoutParams);
                    }
                });

下拉加载后,tv的测量值发生了变化,从原来的303变成了149

查了很久都没有找到问题的解决方法,只能使用SP先去临时保存第一次正常加载的值,下拉刷新后继续使用此值

 mTvContent.getViewTreeObserver().addOnGlobalLayoutListener(
                new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        mTvContent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        if (mRefresh) {
                            mTotalHeight = SharedPreUtil.getInt(Constant.SP_TV_HEIGHT, -1);
                        } else {
                            SharedPreUtil.saveInt(Constant.SP_TV_HEIGHT, mTvContent.getMeasuredHeight());
                            mTotalHeight = mTvContent.getMeasuredHeight();
                        }
                        if (mTotalHeight == -1) {
                            mTotalHeight = mTvContent.getMeasuredHeight();
                        }
                        mThreeLineHeight = mTvContent.getLineHeight() * 3
                                + mTvContent.getPaddingTop()
                                + mTvContent.getPaddingBottom()
                                + 2;
                        //将高度设置为3行的高度
                        ViewGroup.LayoutParams layoutParams = mTvContent.getLayoutParams();
                        layoutParams.height = mThreeLineHeight;
                        mTvContent.setLayoutParams(layoutParams);
                    }
                });

在文本内容不变的情况下,投机取巧的方法…肯定会带来BUG的…暂时先这么使用着…
在这里插入图片描述

问题尚未解决…待解决中…
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值