Двойная проверка правильности реализации фрагмента + шаблона держателя вида
Я перерабатывал код из-за утечки памяти. Код является частью раздела справки приложений, где мы используем FragmentActivity и FragmentPageAdapter, чтобы позволить пользователю пролистывать различные экраны справки. Каждый фрагмент, класс SectionFragment ниже, включает изображение, текст заголовка и основной текст.
Утечка памяти проявилась, потому что каждый раз при вызове onCreateView во фрагменте создавалось новое представление.
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;
}
}
Я все еще новичок во Фрагментах и не участвовал в первоначальной разработке кода, поэтому я не уверен, что мое решение верное, но оно напоминает шаблон держателя представления, который я много раз реализовывал в List Activity. Я был бы очень признателен за любые отзывы о следующей реализации, поэтому мне будет удобнее, если это правильно.
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;
}
}
Я не включил другие классы, связанные с этим кодом, в частности FragmentActivity и FragmentPagerAdapter, потому что они, кажется, реализованы правильно, но по запросу я также могу включить их.