2017-10-17 116 views
0

我在Android中使用scrollView進行了一項活動。 scrollView顯示包含多個項目(文本,更多佈局,內部等)的固定佈局。當活動加載時,我顯示佈局並開始下載圖像 - 下載圖像時,通過將它添加到位於主佈局開頭/頂部的RelativeLayout中,將其顯示在scrollView中。如何防止scrollView更新

相對佈局的高度設置爲WRAP_CONTENT,因此在圖像顯示之前,其高度爲零;當圖像被添加到它時,它會調整圖像的高度。問題是,如果用戶在圖像加載之前向下滾動並且圖像的RelativeLayout離開屏幕,則scrollView的頂部Y會發生變化,並且內容向下移動(這會導致查看內容的人分心)。

爲了解決這個問題,我得到了下載的圖像的高度,檢查圖像是否離開屏幕,如果是這樣,我調用scrollView.scrollBy(0, imageHeight);調整scrollView頂部,這樣糾正了這個問題,但它會出現短暫的「閃爍'之間的屏幕,例如,將圖像添加到佈局(內容向下移動)並調整scrollView頂部(內容回到原始位置)。這裏是代碼「修復」滾動視圖位置:

public void imageLoaded(final ImageView img) { 
     img.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     final int imgHeight = img.getMeasuredHeight(); 

     // image is loaded inside a relative layout - get the top 
     final RelativeLayout parent = (RelativeLayout) img.getParent(); 
     final int layoutTop = parent.getTop(); 

     // adjust the layout height to show the image 
     // 1. this changes the scrollview position and causes a first 'flickering' 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, imgHeight); 
     parent.setLayoutParams(params); 

     // adjust scrollbar so that the current content position does not change 
     // 2. this corrects the scrollview position but causes a second 'flickering' 
     // scrollY holds the scrollView y position (set in the scrollview listener) 
     if (layoutTop < scrollY) 
      scrollview.post(new Runnable() { 
       public void run() { 
        scrollview.scrollBy(0, imgHeight); 
       } 
      }); 

     img.setVisibility(View.VISIBLE); 
    } 

我需要糾正,這是加載/調整過程之前禁用屏幕更新或滾動視圖更新後啓用它的方式是什麼。

任何人都知道如何做到這一點?

+2

程序員更擅長閱讀源代碼。 ; p – user1506104

+0

添加了顯示調整過程的代碼 – user501223

回答

0

事實證明,問題是因爲調用scrollView.scrollBy是從一個線程調用的。刪除它解決了這個問題。這裏是正確的代碼:

public void imageLoaded(final ImageView img) { 
     img.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     final int imgHeight = img.getMeasuredHeight(); 

     // image is loaded inside a relative layout - get the top 
     final RelativeLayout parent = (RelativeLayout) img.getParent(); 
     final int layoutTop = parent.getTop(); 

     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, imgHeight); 
     parent.setLayoutParams(params); 

     if (layoutTop < scrollY) 
      scrollview.scrollBy(0, imgHeight); 

     img.setVisibility(View.VISIBLE); 
    }