Verificação dupla se o padrão de suporte de fragmento + visualização está implementado corretamente
Estou re-trabalhando em algum código devido a um vazamento de memória. O código faz parte da seção de ajuda de aplicativos, na qual estamos usando um FragmentActivity e FragmentPageAdapter para permitir que o usuário passe pelas diferentes telas de ajuda. Cada fragmento, classe SectionFragment abaixo, inclui uma imagem, algum texto de cabeçalho e texto do corp
O vazamento de memória se manifestou porque uma nova exibição estava sendo inflada cada vez que o onCreateView era chamado no fragment
public class SectionFragment extends Fragment {
private ImageView imgvw;
private TextView headerTxvw;
private TextView bodyTxvw;
public int[][] content;
protected int pageIdx;
public SectionFragment(int idx, int[][] content ){
super();
pageIdx = idx;
this.content = content;
}
protected int getPageIdx() {
return pageIdx;
}
protected Drawable getImageDrawable() {
return getResources().getDrawable( content[pageIdx][0] );
}
protected String getHeaderText() {
return getResources().getString( content[pageIdx][1] );
}
protected String getSubeaderText() {
return getResources().getString( content[pageIdx][2] );
}
protected void loadView( View vw ) {
imgvw = (ImageView)vw.findViewById( R.id.top_img );
headerTxvw = (TextView)vw.findViewById( R.id.header_txt );
bodyTxvw = (TextView)vw.findViewById( R.id.body_txt );
imgvw.setImageDrawable( getImageDrawable() );
headerTxvw.setText( getHeaderText() );
bodyTxvw.setText( getSubeaderText() );
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View vw = inflater.inflate( R.layout.help_fragment, null );
loadView( vw );
return vw;
}
}
Ainda sou novo no Fragments e não fiz parte do esforço de codificação original, por isso não tenho certeza de que minha solução esteja correta, mas se parece com o padrão de suporte de exibição que eu implementei várias vezes nas Atividades de Lista. Eu realmente aprecio qualquer feedback sobre a implementação a seguir, para ficar mais confortável com o que está correto.
public class SectionFragment extends Fragment {
static private class ViewHolder {
ImageView imgvw;
TextView headerTxvw;
TextView bodyTxvw;
}
public int[][] _content;
protected int _pageIdx;
public SectionFragment( int idx, int[][] content ){
super();
_pageIdx = idx;
_content = content;
}
protected int getPageIdx() {
return _pageIdx;
}
protected Drawable getImageDrawable() {
return getResources().getDrawable( _content[_pageIdx][0] );
}
protected String getHeaderText() {
return getResources().getString( _content[_pageIdx][1] );
}
protected String getSubeaderText() {
return getResources().getString( _content[_pageIdx][2] );
}
protected void loadView( View vw ) {
_holder.imgvw.setImageDrawable( getImageDrawable() );
_holder.headerTxvw.setText( getHeaderText() );
_holder.bodyTxvw.setText( getSubeaderText() );
}
private View _vw;
private ViewHolder _holder;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if ( _vw == null ) {
_vw = inflater.inflate( R.layout.help_fragment, null );
_holder = new ViewHolder();
_holder.imgvw = (ImageView)_vw.findViewById( R.id.top_img );
_holder.headerTxvw = (TextView)_vw.findViewById( R.id.header_txt );
_holder.bodyTxvw = (TextView)_vw.findViewById( R.id.body_txt );
_vw.setTag( _holder );
} else {
ViewParent oldparent = (ViewParent)_vw.getParent();
if ( oldparent != container ) {
((ViewGroup)oldparent).removeView( _vw );
}
_holder = (ViewHolder)_vw.getTag();
}
loadView( _vw );
return _vw;
}
}
Não incluí as outras classes associadas a esse código, especificamente o FragmentActivity e FragmentPagerAdapter, porque elas parecem ter sido implementadas corretamente, mas, se solicitado, também posso incluí-la