解决ScrollView或ListView中嵌套ListView引起的冲突
老生常谈的滑动冲突问题,今天遇到与大家分享下
1、在ScrollView或ListView等滑动控件中嵌套ListView时,往往会导致ListView显示不完整,只显示一条数据,想使ListView显示完整可以通过重写ListView的onMeasure方法来解决:
public class CustomListView extends ListView {
public CustomListView(Context context) {
super(context);
}
public CustomListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
2、除此外还有一种解决方法:根据ListView子项重置其高度。
java代码:
/**
* 重新计算ListView的高度,解决ScrollView和ListView两个View都有滚动的效果,在嵌套使用时起冲突的问题
* @param listView
*/
public void setListViewHeight(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount();
i < len;
i++) { // listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
// 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight();
// 统计所有子项的总高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
【解决ScrollView或ListView中嵌套ListView引起的冲突】在设置ListView的Adapter填充数据后调用此方法便可。
但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。
推荐阅读
- 技术干货系列|Seata聚合 AT、TCC、SAGA 、 XA事务模式打造一站式的分布式事务解决方案
- 【FAQ】接入HMS|【FAQ】接入HMS Core推送服务,服务端下发消息常见错误码原因分析及解决方法
- java|ES中解决模糊搜索的时候搜索一个中文可以,两个以上中文就不行的情况
- Android数据加密之异或加密算法
- 【一念读书】超级智能既是危机也是解决方案
- Vue特殊使用方法
- 王阳明十句话,解决人生问题的灵丹妙药!
- 基于 Vue3 ,打造前台+中台通用提效解决方案_完结
- threeJS加载obj/gltf模型后,颜色太暗的解决方法
- Java|Java + Selenium + OpenCV解决自动化测试中的滑块验证