Android ScrollView與ListView衝突的解決辦法
阿新 • • 發佈:2022-05-10
問題:
ScrollView巢狀ListView,出現ListView內容無法滑動的問題。
原因:
ListView滾動條無法獲取焦點。
解決方法:
ListView出現滾動是因為內容大於其所要展現的高度,歸根其原因就是內容太長,溢位螢幕之外,無法檢視,所以要滾動內容來輔助檢視。
ScrollView本身就是為了解決內容溢位的問題而存在的,那麼ListView就無需滾動,只要計量好ListView高度,展現在ScrollView當中即可。
如何讓ListView的高度等於內容高度?只需要改變其測量模式即可。
首先新建一個 MyListView 的類繼承 ListView 重寫onMeasure() 方法:
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 defStyleAttr) { super(context, attrs, defStyleAttr); } @Override // 重寫父類onMeasure方法,改變模式 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 呼叫MeasureSpec類的makeMeasureSpec方法傳入測量值和測量模式,heightMeasureSpec的前兩位是模式,後面的才是高度 heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST); // 呼叫父類傳入測量值 super.onMeasure(widthMeasureSpec,heightMeasureSpec); } }
上述程式碼其實只是為了改變ListView的測量模式
接下來在佈局檔案中像使用元件一樣使用該類即可,注意:引入自定義元件要包含完整路徑名。