2017-10-17 11 views
0

私はscrollViewでAndroidでアクティビティを持っています。 scrollViewは、いくつかの項目(テキスト、レイアウト、iamgesなど)を持つ固定レイアウトを表示します。アクティビティがロードされると、レイアウトが表示され、イメージのダウンロードが開始されます。イメージがダウンロードされると、メインレイアウトの先頭または最上部にあるRelativeLayoutにスクロールビューを追加して表示します。scrollViewが更新されないようにする方法

相対レイアウトの高さはWRAP_CONTENTに設定されているため、画像が表示される前の高さはゼロです。画像が追加されると、画像の高さに合わせてサイズが変更されます。問題は、画像がロードされ、画像のRelativeLayoutが画面外にある場合、スクロールビューの上端Yが変化し、コンテンツが下に移動する(コンテンツを見ている人に気を散らす)ということです。

これを修正するには、ダウンロードした画像の高さを確認し、画像が画面外にあるかどうかを確認してください。scrollView.scrollBy(0, imageHeight);を呼び出すことによってscrollViewのトップを調整します。これで問題は解決しますが、レイアウトにイメージを追加する(コンテンツは下に移動する)、scrollViewトップを調整する(コンテンツは元の位置に戻る)など、2つのアクションの間の画面の位置を変更することができます。ここでは、コードであることを「修正」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); 
    } 
関連する問題