2017-09-06 11 views
1

마지막 항목에 패딩을 동적으로 추가하여 RecyclerView의 최소 높이를 유지하는 ItemDecoration을 만들려고합니다.RecyclerView에서 하위보기 높이 가져 오기 ItemDecoration.getItemOffsets

덧씌우 기량을 계산하려면 모든 하위 항목의 전체 높이를 알아야합니다. 단일 뷰의 높이를 가져 와서 어댑터의 항목 수를 곱하여이를 근사하고 있습니다.

내가 겪고있는 문제는 view.getHeight()가 항상 올바른 높이를 반환하지 않는다는 것입니다. 일반적으로 처음 getItemOffsets()가 호출되면 높이는 원래 크기보다 훨씬 더 작습니다 (예 : 30px 및 300px). 레이아웃 XML에서 고정 된 높이를 하위 뷰에 부여하는 경우에도 이러한 상황이 발생합니다. 이것은 ItemDecoration에서 올바른 뷰 차원을 얻는 방법을 확신 할 수 없기 때문에 측정/레이아웃주기와 관련이 있다고 생각합니다.

getItemOffsets()에서 프로그래밍 방식으로 자식보기 높이를 가져 오는 올바른 방법은 무엇입니까?

ItemDecoration :

public class MinHeightPaddingItemDecoration extends RecyclerView.ItemDecoration { 
    private static final String LOG_TAG = MinHeightPaddingItemDecoration.class.getSimpleName(); 

    private int mMinHeight; 

    public MinHeightPaddingItemDecoration(int minHeight) { 
     super(); 
     mMinHeight = minHeight; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView recyclerView, RecyclerView.State state) { 
     int itemCount = state.getItemCount(); 
     int lastPosition = itemCount - 1; 
     int itemPosition = recyclerView.getChildAdapterPosition(view); 
     int layoutPosition = recyclerView.getChildLayoutPosition(view); 

     // If this view isnt on screen then do nothing 
     if (layoutPosition != RecyclerView.NO_POSITION && itemPosition == lastPosition) { 

      // NOTE: view.getHeight() doesn't always return the correct height, even if the layout is given a fixed height in the XML 
      int childHeight = view.getHeight(); 

      int totalChildHeight = childHeight * itemCount; 

      int minHeight = getMinHeight(); 
      if (totalChildHeight < minHeight) { 
       outRect.bottom = minHeight - totalChildHeight; 
      } 
     } 
    } 

    private int getMinHeight() { 
     return mMinHeight; 
    } 
} 

recycler_view_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<layout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools"> 
    <data> 
     <variable name="controller" type="my.ViewController"/> 
    </data> 

    <android.support.v7.widget.CardView 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:layout_gravity="center" 
     android:clickable="true" 
     android:onClick="@{() -> controller.doSomething()}"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 
       <TextView 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:text="Child layout" 
        /> 
     </RelativeLayout> 

    </android.support.v7.widget.CardView> 
</layout> 

답변

0

나는 고정 된 크기의 아이 뷰에 대한이 해결 방법을 발견했다. 동적 인 크기의 레이아웃을 처리하는 방법을 아직 잘 모릅니다.

// NOTE: view.getHeight() doesn't always return the correct height 
// NOTE: even if the layout is given a fixed height in the XML. 
// NOTE: Instead directly access the LayoutParams height value 
int childHeight = view.getLayoutParams().height;