中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android 中利用ScrollView對GridView進行嵌套

發布時間:2020-11-30 17:47:20 來源:億速云 閱讀:523 作者:Leah 欄目:移動開發

本篇文章為大家展示了如何在Android 中利用ScrollView對GridView進行嵌套,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Android 中ScrollView嵌套GridView

在Android開發中,經常有一些UI需要進行固定style的動態布局,然而由于現在的UI都喜歡把一個界面拉的很長,所以我們很多情況下需要使用ScrollView來嵌套列表控件來實現UI。這樣就導致了很多不順心的問題。

問題一:列表控件顯示不完全

原因是嵌套情況下,ScrollView不能正確的計算列表控件的高度。

有兩種解決方案

方案一

在適配器賦值完成后代碼動態計算列表的高度。這里貼出ListView的計算代碼,GridView的計算方式類似,不過需要考慮列數,下面代碼沒有加上列表控件padding的計算,如果你設置了這個屬性,需要加上計算代碼

public void setListViewHeightBasedOnChildren(ListView listView) {  
    // 獲取ListView對應的Adapter  
    ListAdapter listAdapter = listView.getAdapter();  
    if (listAdapter == null) {  
      return;  
    }  

    int totalHeight = 0;  
    for (int i = 0, len = listAdapter.getCount(); i < len; i++) {  
      // listAdapter.getCount()返回數據項的數目  
      View listItem = listAdapter.getView(i, null, listView);  
      // 計算子項View 的寬高  
      listItem.measure(0, 0);  
      // 統計所有子項的總高度  
      totalHeight += listItem.getMeasuredHeight();  
    }  

    ViewGroup.LayoutParams params = listView.getLayoutParams();  
    params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
    // listView.getDividerHeight()獲取子項間分隔符占用的高度  
    // params.height最后得到整個ListView完整顯示需要的高度  
    listView.setLayoutParams(params);  
  }

方案二

重寫列表控件的onMeasure方法,這種方案不會出現列表控件本身的滾動條,并且viewholder復用機制會失效

@Override
  public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(1 << 16, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, expandSpec);
  }

方案一代碼多,需要多次寫,建議寫成工具類方便調用;方案二在數據量大到不能一屏顯示完的情況下會有性能問題,而且快速滑動的時候ScrollView會不停的去計算列表控件的高度。賊影響繪制性能。
兩種方案有利有弊,大家自己取舍

問題二:列表控件自動獲取焦點,導致ScrollView自動滾動到列表控件所在的位置

這個問題其實有很多種解決方案,歸結起來是兩種。

方案一

等待列表控件數據全部加載完成后(包括圖片加載)調用ScrollView.fullScroll(ScrollView.FOCUS_UP);

方法讓ScrollView滾動到頂部。這個加載完成的時間不好控制,搞得不好會有滾動動畫出現,很尷尬的事情。

方案二

重寫列表控件的如下兩個方法,使之固定返回false

@Override
  public boolean isFocused() {
    return false;
  }

  @Override
  public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
    return false;
  }

兩種方案的優缺點很明顯,喔,第二種方案的缺點我目前沒發現。如果你這么使用發現了什么坑,請留言告知

問題三 滑動沖突

這問題就更操蛋了,根據UI的不同,操蛋程度也不同,涉及到view的事件傳遞知識,很難給出所有情況的解決代碼
解決起來也離不開幾個要點,不過首先你得熟悉view的事件傳遞

你需要根據情況決定重寫列表控件與ScrollView的如下幾個方法,根據情況給方法返回不同的bool值來告訴控件是否攔截或者傳遞事件,需要哪個控件相應哪個方向的滾動事件就攔截哪個方向的事件傳遞,作為一個有追求的開發者,切記不要一通亂攔截

 @Override
  public boolean onTouchEvent(MotionEvent ev) {
    return super.onTouchEvent(ev);
  }

  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
    return super.onInterceptTouchEvent(ev);
  }

  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    return super.dispatchTouchEvent(ev);
  }

給個小彩蛋

getParent().requestDisallowInterceptTouchEvent(boolean b);

上述內容就是如何在Android 中利用ScrollView對GridView進行嵌套,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中西区| 曲麻莱县| 宜州市| 汾西县| 湾仔区| 德保县| 宁南县| 富阳市| 喀什市| 肇州县| 沙田区| 姜堰市| 中江县| 沁源县| 临沂市| 永靖县| 资讯| 云霄县| 宁化县| 沂水县| 石门县| 察雅县| 巴塘县| 临武县| 青岛市| 微山县| 荥阳市| 扬州市| 姚安县| 老河口市| 梨树县| 陇南市| 商河县| 军事| 广饶县| 通州区| 舒城县| 两当县| 三都| 林口县| 宁安市|