2016-04-11 4 views
0

私はこのようなAndroidのレイアウトを持っている:兄弟の位置が変更されたときにアンドロイドの高さをリフレッシュするにはどうすればよいですか?

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/main_layout" 
     android:orientation="vertical"> 
<android.support.v7.widget.RecyclerView 
      android:id="@+id/rv_weighing" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1"/> 
<android.support.v7.widget.CardView 
      xmlns:card_view="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/cv_price_holder" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

<!-- another view elements here --> 
</android.support.v7.widget.CardView> 

</LinearLayout> 

基本的に私は、最初の要素が親と第二要素間の残りのスペースを埋めたいです。実行時に2番目の要素のY位置を変更するまでは正常に動作します。私は親と最初の要素の両方で.invalidate().requestLayout()を呼び出そうとしましたが、期待通りに動作しないようです。

<RelativeLayout>を使用して親レイアウトを変更しようとしましたが、最初の要素にandroid:layout_above="@+id/cv_price_holder"を設定しましたが、うまく機能しませんでした。

編集:ここでは、レイアウトを切り替えるには、呼び出されたメソッドは、次のとおりです。

public void togglePriceHolder(){ 
     float newY = mPriceHolderToggleState ? -mPriceHolderToggleLimitY : mPriceHolderToggleLimitY; 
     int newIcon = mPriceHolderToggleState ? R.drawable.ic_keyboard_arrow_down_white_36dp : R.drawable.ic_keyboard_arrow_up_white_36dp; 
     mBtnTogglePriceHolder.setImageResource(newIcon); 
     mCvPriceHolder.animate().translationYBy(newY).setListener(new Animator.AnimatorListener() { 
      @Override 
      public void onAnimationStart(Animator animation) {} 

      @Override 
      public void onAnimationEnd(Animator animation) { 
       // refresh the layout 
       rvWeighing.forceLayout(); 
       mMainLayout.requestLayout(); 
      } 

      @Override 
      public void onAnimationCancel(Animator animation) {} 

      @Override 
      public void onAnimationRepeat(Animator animation) {} 
     });  
     mPriceHolderToggleState = !mPriceHolderToggleState; 
} 

質問は第二の要素のY位置が変更されたときに最初の要素は、その高さを調整することができますので、私はレイアウトをリフレッシュすることができますどのようにでしょうか?事前に

おかげで

enter image description here

答えて

3

寸法変更してからrequestLayout()を呼び出す可能性があるビューのforceLayout()を呼び出してみてください。

ビューで親ビューのすべての親が再描画されますが、特定のビューでforceLayout()を呼び出すと、次のレイアウトパスのビュー(既定のトラバーサルと共に)がマークされません。

具体的なケースでは、再描画する兄弟にforceLayout()を呼び出して、いずれかのビューからrequestLayout()を呼び出してみてください。

+0

こんにちはサルサック、助けてくれてありがとうございますが、私はまだそれを動作させることはできません。私はレイアウトを切り替えるために使用するメソッドを追加する質問を編集しました。それは間違っていますか? – qatz

+0

@qatzあなたが試すことができることは、mMainLayoutではなくmCvPriceHolderでrequestLayoutを呼び出すことです。 –

関連する問題