2012-12-20 35 views
1

我正試圖實現一個畫廊。使用片段作爲照片庫的Android,如何?

由於圖庫小部件已被棄用...實現它,並有分頁滾動效果,我使用片段(android兼容性v4)來做到這一點。

一切都看起來不錯,直到滾動回來......我的APP只是強制關閉的原因是:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

看起來它重新獲得一個ImageView的時候向後滾動顯示上一張照片。

而且我不知道如何解決這個問題?

這裏是我的xml &代碼

[XML]

<android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_below="@id/head" android:layout_width="wrap_content" android:layout_height="350dp" android:layout_marginTop="35dp" /> 

[代碼]

public class PhotoView extends FragmentActivity 
{ 
    private Button btnBack=null; 
    private ClickHandler click=null; 
    private ViewPager pager=null; 
    private ArrayList<ImageView> imgList=new ArrayList<ImageView>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.photo_show); 
    initUI(); 
    handler.sendEmptyMessage(0); 
    } 

    private void initUI() 
    { 
    btnBack=(Button)findViewById(R.id.btnBack); 
    btnBack.setOnClickListener(click); 
    pager=(ViewPager)findViewById(R.id.pager); 
    } 

    private Handler handler=new Handler() 
    { 
    public void handleMessage(Message msg) 
    { 
     loadPhotos(); 
    } 
    }; 

    private void loadPhotos() 
    { 
    for(int i=0; i<Constants.PHOTO_LIST.size(); i++) 
    { 
     ImageView img=new ImageView(this); 
     img.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     imgList.add(img); 
     new ImageDL(Constants.PHOTO_LIST.get(i).getFileId(), Params.IMAGE_SIZE_PARAM_ORIGINAL).execute(img); // async D/L photo 
    } 
    pager.setAdapter(new PhotoAdapter(getSupportFragmentManager())); 
    } 

    @Override 
    public void onBackPressed() 
    { 
    super.onBackPressed(); 
    btnBack.performClick(); 
    return; 
    } 

    @Override 
    protected void onStop() 
    { 
    super.onStop(); 
    for(int i=0; i<imgList.size(); i++) //Do recycle when activity stopped, but I'm not yet sure this code is right... 
    { 
     Drawable drawable=imgList.get(i).getDrawable(); 
     if(drawable instanceof BitmapDrawable) 
     { 
     BitmapDrawable bitmapDrawable=(BitmapDrawable) drawable; 
     Bitmap bitmap=bitmapDrawable.getBitmap(); 
     bitmap.recycle(); 
     } 
    } 
    imgList.clear(); 
    imgList=null; 
    } 

    private class ClickHandler implements OnClickListener 
    { 
    public void onClick(View v) 
    { 
     if(v==btnBack) 
     { 
     finish(); 
     overridePendingTransition(R.anim.lr1, R.anim.lr2); 
     System.gc(); 
     } 
    } 
    } 

    private class PhotoAdapter extends FragmentPagerAdapter 
    { 
    public PhotoAdapter(FragmentManager mgr) 
    {super(mgr);} 

    @Override 
    public int getCount() 
    { 
     return(imgList.size()); 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     return(new PhotoFragment(position)); 
    } 
    } 

    private class PhotoFragment extends Fragment 
    { 
    private int index=-1; 

    private PhotoFragment(int index) 
    {this.index=index;} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     return imgList.get(index); 
    } 
    } 
} 

這是我第一次在我的代碼中使用Fragment API,我不確定我所做的代碼邏輯是正確的。

有什麼想法可以幫助我解決這個問題,或者在Android 2.3〜4.x中實現gallery(帶分頁滾動)的另一種更好的方法嗎?

回答

0

您不應該使用imgList作爲緩存。

您的onCreateView()實現的問題是: 。在第0頁,ViewPager會將imageView添加到頁面0中,並將imageView添加到其佈局(父視圖)中(我認爲)。 。當您回滾到第0頁時,ViewPager將再次調用onCreateView(),因此會在嘗試將已添加的imageView重新添加到其佈局時發生錯誤:

java.lang.IllegalStateException:指定的子項已經具有家長。

所以你不應該在loadPhotos()方法內使用imgList;而是在onCreateView()內部初始化imageView。

修改後的代碼:

private void loadPhotos() 
    { 

    pager.setAdapter(new PhotoAdapter(getSupportFragmentManager())); 
    } 


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     ImageView img=new ImageView(this); 
     img.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

     new ImageDL(Constants.PHOTO_LIST.get(i).getFileId(), Params.IMAGE_SIZE_PARAM_ORIGINAL).execute(img); // async D/L photo 


     return img; 
} 
+0

謝謝,我終於用Horizo​​ntalPager來實現我的畫廊... – RRTW