(1)显示不全:listview只能显示出一个item
解决方法:手动计算出listview的实际高度
public static void setListViewHeightBasedOnChildren(ListView listView) {
if (listView == null) return;
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
当item中存在多行textview的时候,高度计算会不准确,因为`listItem.measure(0, 0);` measure方法传入参数(0,0)会忽略掉父view的限制,这时要自己make一个MeasureSpec。传入并计算高度
private int getListviewHeight(ListView pull) {
ListAdapter listAdapter = pull.getAdapter();
if (listAdapter == null) {
return 0;
}
DisplayMetrics dm = getResources().getDisplayMetrics();
int w_screen = dm.widthPixels;
int totalHeight = 0;
int listViewWidth = w_screen; //listView在布局时的宽度,有间距要适当减去
int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth, View.MeasureSpec.AT_MOST);
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, pull);
listItem.measure(widthSpec, 0);
int itemHeight = listItem.getMeasuredHeight();
totalHeight += itemHeight;
}
// 减掉底部分割线的高度
int historyHeight = totalHeight
+ (pull.getDividerHeight() * listAdapter.getCount() - 1);
return historyHeight;
}
(2)滑动冲突:在listview可滑动时,scrollview无法滑动
解决方法:
1.自定义listview,重写dispatchTouchEvent方法
public class ListViewForScrollView extends ListView {
int mLastMotionY;
boolean bottomFlag;
public ListViewForScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
}
2.为listview设置监听
listView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
listView.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});