问题描述
今天本来心情很愉快的,因为需求是酱样子的,扫了一眼马上用我的核桃仁处理器,迅速定位–>直接就RecycleView嵌套RecycleView呀,简单粗暴我喜欢。
(签到跟签退之间的View,测量每个子item的高度,然后动态赋值给这个View)
然后我就笑不出来了,因为什么呢,开始的item数量少,当数据多了,屏幕显示不完,拉下去之后就Crash了!WTF!
说我这个对象不存在,到底为什么会出现这种情况?百度一下–>RecyclerView有良好的回收机制,所以只加载屏幕显示的View,未显示部分将回收。由于getChildAt()这个方法只能get到屏幕显示的部分,也就是说:假如屏幕上只能显示5个View,当往下滑动到第6、7个View的时候,他们的position虽然还是5,6但是由于getChildAt()只能get到屏幕上显示的View,所以它实际的position其实是4、5。想要get到第6个View不能用getChildAt(6)而要用getChildAt(4)
解决方法
其实这问题之前在ListView中也出现过,不过只需要用当前的position减去屏幕显示的第一个View的position(getFirstVisiblePosition())就行。
RecycleView中没有这个方法,But可以有这个方法
final LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
layoutManager.findFirstVisibleItemPosition()//获取第一个先是的View的索引
使用recycleView中的 position – 显示view的索引即可
以下是我解决问题的办法
@Override
public void onBindViewHolder(final ViewHoldX holder, int position) {
final int S = position;
final LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
holder.recycler_view.setLayoutManager(layoutManager);
OneAdapter oneAdapter = new OneAdapter(mContext, mList.get(position).getFruitBeen());
holder.recycler_view.setAdapter(oneAdapter);
fruitBeen = mList.get(position).getFruitBeen();
holder.recycler_view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
View childAt = layoutManager.getChildAt(S - layoutManager.findFirstVisibleItemPosition());
if (childAt !=null){
height = childAt.getHeight();
}
int x = height * fruitBeen.size();
ViewGroup.LayoutParams params = holder.view1.getLayoutParams();
params.height = x;
holder. view1.setLayoutParams(params);
}
});
}
每天进步一点点
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2851.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...