今天項目使用到ScrollView嵌套HorizontalScrollView,ScrollView裏包含GridView,發現幾個問題很經典,在此記錄:
問題1.ScrollView嵌套HorizontalScrollView跳變問題,ScrollView、HorizontalScrollView自動下拉到最後一行;
設置到初始座標(0,0)解決方法:
(時機:數據解析完並且刷新notifyDataSetChanged()之後進行下面代碼設置)
scrollview.smoothScrollTo(0, 0);
horizontalscrollview.fullScroll(ScrollView.FOCUS_LEFT);
注意:
這兩行代碼無法達到效果( scrollview.fullScroll(ScrollView.FOCUS_UP);horizontalscrollview.fullScroll(ScrollView.FOCUS_LEFT); )
問題2.ScrollView與GridView衝突,GridView無法顯示所有數據和滑動;
方法1)GridView如果知道行數大小可以直接給定高度,但是一般數據都是不固定的,所以只需在getView()進行簡單的設置即可解決問題:
Collections.sort(arraylist);//根據解析數據自定義高度數據放在集合裏並升序排列
LinearLayout.LayoutParams lp2 =(android.widget.LinearLayout.LayoutParams) gridview.getLayoutParams();lp2.height=arraylist.get(arraylist.size()-1);//高度取升序集合裏最大的高度即最後一位
gridview.setLayoutParams(lp2);
方法2)自定義控件實現可滑動:
public class GridView4ScrollView extends GridView {
public GridView4ScrollView(Context context) {
super(context);
}
public GridView4ScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public GridView4ScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override//ScrollView嵌套GridView
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
other:其它控件測量getViewTreeObserver()
1
2
3
4
5
6
7
8
9
|
ViewTreeObserver
vto = imageView.getViewTreeObserver(); vto.addOnGlobalLayoutListener( new OnGlobalLayoutListener()
{ @Override public
void
onGlobalLayout() { imageView.getViewTreeObserver().removeGlobalOnLayoutListener( this ); imageView.getHeight(); imageView.getWidth(); } }); |