在ScrollView中嵌套使用ListView,ListView只會顯示一行多一點。兩者進行嵌套,即會發生沖突。
由於ListView本身都繼承於ScrollView,一旦在ScrollView中嵌套ScrollView,
那么里面的ScrollView高度計算就會出現問題。
我們也就無法得到想要的效果。
下面進入正題,我們將討論ScrollView中嵌套ListView情況。
核心解決方案: 重寫ListView或者GridView的OnMesure 方法。對GridView同樣適用。
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }
ScrollView中嵌套ListView:
package com.android.xiaomolongstudio.example.scrollviewlistview; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.widget.ArrayAdapter; import android.widget.ListView; /** * * @author 小尛龍 * */ public class MainActivity extends Activity { ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData())); } private List<String> getData() { List<String> data = new ArrayList<String>(); for (int i = 0; i < 30; i++) { data.add("測試" + i); } return data; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
自定義ListView:
package com.android.xiaomolongstudio.example.scrollviewlistview; import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; public class MyListView extends ListView { public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(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內容,怎么一開始就顯示頭部。
ScrollView有個屬性mScrollView.scrollTo(x, y)可以顯示位置。
但是實際卻沒有達到效果,查了說mScrollView.scrollTo(x, y)首次初始化時無效果。
最后我用了mScrollView.smoothScrollTo(0,0);