[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的…暂时先这么使用着…