3

recyclerView가 나타나기 전에 측정 할 때 현재 문제가 발생합니다. "확장"애니메이션을 시작하려면 measuredHeight가 필요합니다. 내가 일하고 있어요 내가 GridLayoutManager표시되기 전에 Recyclerview를 측정하십시오.

와 RecyclerView에
final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
final int heightSpec = View.MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, View.MeasureSpec.AT_MOST); 
mGridView.measure(widthSpec, heightSpec); 
int targetHeight = mGridView.getMeasuredHeight(); 

그것을 마이그레이션하려고

이전 코드에서 GRIDVIEW 위해 이루어졌다 그것은 GRIDVIEW 작업되었지만 나는 측정 방법을 호출하는 경우 recyclerView에 동일한 측정 사양을 사용하면 결과는 항상 16777215입니다. 이는 내가 생각하기에 최대 값일 수 있지만 무엇을 말할 수는 없습니다.

I 그것이 다음 측정 사양으로 측정하여 화면에 렌더링되기 전에 뷰가 측정 될 수 있음을 설명 일부 포스트 반드시

:

final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
final int heightSpec = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); 

하지만 recyclerView.getMeasuredHeight 0을 얻을 수를();

화면에 렌더링되기 전에 recyclerView의 높이를 올바르게 측정 할 수있는 방법이 있습니까?

감사합니다.

답변

1

보기를 추가하기 전에 측정하려고합니까? 그렇다면 위험합니다.

또한 RecyclerView와 관련하여 기존 레이아웃 관리자는 아직 WRAP_CONTENT를 지원하지 않습니다. 그들은 match_paren & 정확한 크기를 지원하는 기본 구현에 의존합니다.

항목의 높이를 알고 있다면 GridLayoutManager를 확장하고 onMeasure를 재정 의하여 직접 측정 할 수 있습니다. yigit 포스트에

+0

답변 해 주셔서 감사합니다. 지원되지 않는 WRAP_CONTENT가 문제를 설명 할 수 있습니다. 어떤 사람이 분명히 다음과 같이 신고했습니다. https://code.google.com/p/android/issues/detail?id=74772&. XML 레이아웃 파일에서 뷰가 팽창되어 뷰 계층에 추가됩니다. 불행히도 나는 recyclerView로 전달할 수있는 여러 어댑터가 있고 다른 항목을 표시 할 수 있으므로 어린이 높이를 알지 못합니다. 내가 항목에 사용 된 레이아웃을 검색 할 수 있다면, 그것을 부 풀릴 수 있고 그것을 측정 한 다음 gridLayoutManager 높이를 계산할 수 있습니다. 나는 그것을 시도 할 것이다. –

+0

당신이 이미 문제를 해결 한 것을 보았습니다. 일반 솔루션이 필요한 경우 첫 번째 측정 값이 모든 공간을 차지하도록 허용 한 다음 다른 측정 값을 요청하고 다음 측정 값은 마지막 자식 좌표 (getDecoratedEnd (view))를 반환 할 수 있습니다. 어댑터 크기가 항상 0보다 큰 경우 onMeasure 호출의 #보기만으로도 충분할 수 있습니다. 다가올 릴리스에서는이 기능을 사용할 수 있습니다. – yigit

+0

아쉽게도 뷰를 측정 할 필요가있는 확장 메소드를 처음 호출 할 때 어댑터를 작성하고 채웠습니다. 어떤 하위보기를 원할 때, recyclerview는 하위 항목을 포함하지 않습니다. 적어도 어린이보기에 대한 언급을 갖기 위해서는 적어도 한 번은 그려야한다고 생각합니다. –

1

덕분에, 나는 마지막으로 수동으로 측정, 아이의 관점을 팽창에 의해 미래 recyclerView 높이를 계산할 수 :

final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
final int heightSpec = View.MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, View.MeasureSpec.AT_MOST); 

마지막을 gridLayoutManager에 포함 된 행의 수에 의해 그 measuredHeight와 곱. WRAP_CONTENT 지원은 곧 RecycleViews layoutManagers에 제공 될 예정입니다.