RecyclerView调用isViewPartiallyVisible报ClassCastException问题求助
解决RecyclerView isViewPartiallyVisible 类转换异常问题
问题根源
你遇到的android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v7.widget.RecyclerView$LayoutParams异常,本质是传错了视图对象!LayoutManager的isViewPartiallyVisible方法要求传入的View必须是RecyclerView的直接子项(也就是ViewHolder的itemView),而你传入的是item布局内部的AppCompatTextView——它的LayoutParams来自父容器(比如LinearLayout),自然无法转换成RecyclerView的LayoutParams,和你替换成AppCompatTextView无关。
解决方案
根据你的实际需求,分两种场景处理:
1. 若要判断整个item是否部分可见
直接传入ViewHolder的itemView即可,这是最符合isViewPartiallyVisible方法设计的用法:
// 假设已获取目标ViewHolder实例 RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); boolean isItemPartiallyVisible = layoutManager.isViewPartiallyVisible(holder.itemView, false, false);
2. 若需判断item内部的AppCompatTextView是否可见
如果确实要检测子控件的可见性,需要手动计算它与RecyclerView的重叠区域,代码示例如下:
// 获取目标AppCompatTextView AppCompatTextView targetTv = holder.itemView.findViewById(R.id.your_text_view_id); RecyclerView recyclerView = ...; // 你的RecyclerView实例 // 1. 获取TextView的全局屏幕坐标 int[] tvLocation = new int[2]; targetTv.getLocationOnScreen(tvLocation); int tvLeft = tvLocation[0]; int tvTop = tvLocation[1]; int tvRight = tvLeft + targetTv.getWidth(); int tvBottom = tvTop + targetTv.getHeight(); // 2. 获取RecyclerView的全局屏幕坐标 int[] rvLocation = new int[2]; recyclerView.getLocationOnScreen(rvLocation); int rvLeft = rvLocation[0]; int rvTop = rvLocation[1]; int rvRight = rvLeft + recyclerView.getWidth(); int rvBottom = rvTop + recyclerView.getHeight(); // 3. 计算两者的重叠区域 int overlapLeft = Math.max(tvLeft, rvLeft); int overlapTop = Math.max(tvTop, rvTop); int overlapRight = Math.min(tvRight, rvRight); int overlapBottom = Math.min(tvBottom, rvBottom); // 4. 判断是否存在有效重叠(即TextView是否部分/完全可见) boolean isTvPartiallyVisible = (overlapLeft < overlapRight) && (overlapTop < overlapBottom);
额外提醒
如果你的RecyclerView是嵌套在滚动容器(比如ScrollView)里的,计算坐标时记得加上RecyclerView自身的滚动偏移量,用recyclerView.getScrollX()和recyclerView.getScrollY()调整即可。
内容的提问来源于stack exchange,提问作者SomethingsGottaGive
相关产品推荐
相关产品推荐

