package com.app.util;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ListAdapter;
import android.widget.ListView;
/**
* 解决view高度之类的问题
* @author Wonghoman
*/
public class ViewUtil {
private final String TAG = "ViewUtil";
/**
* 动态改变listView的高度
* 计算ExpandableListView的group项的高度的方法(即计算listview合并时的高度的方法)
* 备注:ExpandableListView是listview的子类所以,listview的方法它同样可以使用
*
* maxHeight:最大高度,不作限制的话用“非正数”表示
*/
public static void setListViewHeightBasedOnChildren(ListView listView, int maxHeight) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if(listAdapter == null) {
return;
}
int totalHeight = 0;
for(int i = 0, len = listAdapter.getCount(); i < len; i++) {
View listItem = listAdapter.getView(i, null, listView);
if(listItem == null)
return;
listItem.measure(0, 0); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
if(maxHeight > 0){
params.height = params.height > maxHeight ? maxHeight : params.height;
}
listView.setLayoutParams(params);
}
/**
* 可扩展listview展开时调用
* 计算ExpandableListView展开时group下的子view列表的高度的方法
* @param listView
* @param groupPosition
*/
public static void setExpandedListViewHeightBasedOnChildren(
ExpandableListView listView, int groupPosition) {
ExpandableListAdapter listAdapter = listView.getExpandableListAdapter();
if (listAdapter == null) {
return;
}
View listItem = listAdapter.getChildView(groupPosition, 0, true, null,
listView);
listItem.measure(0, 0);
int appendHeight = 0;
for (int i = 0; i < listAdapter.getChildrenCount(groupPosition); i++) {
appendHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
// Log.d(TAG, "Expand params.height" + params.height);
params.height += appendHeight;
listView.setLayoutParams(params);
}
/**
* 可扩展listview收起时调用
* 计算ExpandableListView合并时消除group下的子view列表的高度的方法
* @param listView
* @param groupPosition
*/
public static void setCollapseListViewHeightBasedOnChildren(
ExpandableListView listView, int groupPosition) {
ExpandableListAdapter listAdapter = listView.getExpandableListAdapter();
if (listAdapter == null) {
return;
}
View listItem = listAdapter.getChildView(groupPosition, 0, true, null,
listView);
listItem.measure(0, 0);
int appendHeight = 0;
for (int i = 0; i < listAdapter.getChildrenCount(groupPosition); i++) {
appendHeight += listItem.getMeasuredHeight();
}
/*Log.d(TAG,
"Collapse childCount="
+ listAdapter.getChildrenCount(groupPosition));*/
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height -= appendHeight;
listView.setLayoutParams(params);
}
/**
* 判断点击屏幕的位置是不是在指定的view上
* @param view
* @param ev
* @return
*/
public static boolean inRangeOfView(View view, MotionEvent ev) {
int[] location = new int[2];
view.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
if (ev.getX() < x || ev.getX() > (x + view.getWidth()) || ev.getY() < y
|| ev.getY() > (y + view.getHeight())) {
return false;
}
return true;
}
}
自己的View工具类---ViewUtil
最新推荐文章于 2020-07-20 10:40:54 发布