Ho anche riscontrato questo problema, ma nel mio caso ho avuto un FragmentPagerAdapterche stava fornendo le ViewPagersue pagine. Il problema che avevo era quello onMeasure()di essere ViewPagerstato chiamato prima che uno qualsiasi Fragmentsfosse stato creato (e quindi non poteva dimensionarsi correttamente).
Dopo un po 'di tentativi ed errori, ho scoperto che il finishUpdate()metodo di FragmentPagerAdapter viene chiamato dopo che Fragmentssono stati inizializzati (da instantiateItem()in FragmentPagerAdapter) e anche dopo / durante lo scorrimento della pagina. Ho creato una piccola interfaccia:
public interface AdapterFinishUpdateCallbacks
{
void onFinishUpdate();
}
che passo nel mio FragmentPagerAdaptere chiamo:
@Override
public void finishUpdate(ViewGroup container)
{
super.finishUpdate(container);
if (this.listener != null)
{
this.listener.onFinishUpdate();
}
}
che a sua volta mi permette di chiedere la setVariableHeight()mia CustomViewPagerimplementazione:
public void setVariableHeight()
{
// super.measure() calls finishUpdate() in adapter, so need this to stop infinite loop
if (!this.isSettingHeight)
{
this.isSettingHeight = true;
int maxChildHeight = 0;
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY);
for (int i = 0; i < getChildCount(); i++)
{
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED));
maxChildHeight = child.getMeasuredHeight() > maxChildHeight ? child.getMeasuredHeight() : maxChildHeight;
}
int height = maxChildHeight + getPaddingTop() + getPaddingBottom();
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.measure(widthMeasureSpec, heightMeasureSpec);
requestLayout();
this.isSettingHeight = false;
}
}
Non sono sicuro che sia l'approccio migliore, amerei i commenti se pensi che sia buono / cattivo / cattivo, ma sembra funzionare abbastanza bene nella mia implementazione :)
Spero che questo aiuti qualcuno là fuori!
EDIT: ho dimenticato di aggiungere un requestLayout()dopo aver chiamato super.measure()(altrimenti non ridisegna la vista).
Ho anche dimenticato di aggiungere l'imbottitura del genitore all'altezza finale.
Ho anche lasciato cadere il MeasureSpecs originale larghezza / altezza a favore della creazione di uno nuovo come richiesto. Ho aggiornato il codice di conseguenza.
Un altro problema che ho avuto è stato che non si sarebbe adattato correttamente in a ScrollViewe ho scoperto che il colpevole stava misurando il bambino con MeasureSpec.EXACTLYinvece di MeasureSpec.UNSPECIFIED. Aggiornato per riflettere questo.
Queste modifiche sono state tutte aggiunte al codice. Puoi controllare la cronologia per vedere le versioni precedenti (errate) se lo desideri.