在写一个界面既包含ScrollView又包含listView时,你可能添加完数据后界面显示在listView的最低端,需要上划到最顶端,解决办法:
scroll_view.smoothScrollTo(0,20); commentsRecycleview.setFocusable(false);//listView缺失焦点
listView只显示一横解决办法:
我在网上查了,好多人说最好重新定义listView的高度,后来发现这个方法在listView中item是固定高度的时候还是好使的,高度不确定就麻烦了,他还是会显示不全,可能和适配的时候listView优化有关系,
最后解决办法:/** * scrollview嵌套listview显示不全解决 * * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { 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); }
自定义一个Listview,继承自Listview,代码如下:
public class ListViewForScrollView extends ListView { public ListViewForScrollView(Context context) { super(context); } public ListViewForScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public ListViewForScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * 只需要重写这个方法即可 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }
//Listview中嵌套Listview显示不完整和滑动冲突的问题
}@Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { // 当手指触摸listview时,让父控件交出ontouch权限,不能滚动 case MotionEvent.ACTION_DOWN: setParentScrollAble(false); case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: // 当手指松开时,让父控件重新获取onTouch权限 setParentScrollAble(true); break; } return super.onInterceptTouchEvent(ev); } // 设置父控件是否可以获取到触摸处理权限 private void setParentScrollAble(boolean flag) { getParent().requestDisallowInterceptTouchEvent(!flag); }
在使用的时候,用这个控件代替Listview控件即可。