2016-09-20 88 views
0

我創建了一個ViewPager,我在其中使用bitmapArray在viewpager中顯示圖像。每件事情都可以正常工作,但是當我添加新數據並調用notifydatasetchange時,應用程序崩潰。當向viewpager添加新數據時,應用程序崩潰

在這個應用程序中,我正在下載歌曲,並從該文件中獲取下載的歌曲的位圖並添加到位圖數組中。

它提供了以下Execption:

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

我無法找到是什麼原因導致這種execption

適配器類ViewPager是:

public class CoverFlowPagerAdapter extends PagerAdapter { 

    ArrayList<Bitmap> mBitmapArray; 
    Context c; 

    interface CoverFlowClick { 
     public void coverClick(int coverFlowPosition); 
    } 

    CoverFlowClick mCoverFlowClick; 

    public CoverFlowPagerAdapter(Context c, ArrayList<Bitmap> mBitmapArray) { 
     this.c = c; 
     this.mBitmapArray = mBitmapArray; 
     mCoverFlowClick = (CoverFlowClick) c; 
    } 

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

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return (object == view); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, final int position) { 

     ImageView imageView; 
     View v = null; 
     LayoutInflater inflater= (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v=inflater.inflate(R.layout.coverflow_item,null); 
     imageView= (ImageView) v.findViewById(R.id.coverFlowImage); 

     imageView.setImageBitmap(mBitmapArray.get(position)); 

     container.addView(imageView); 
     imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(c, "Clicked::--" + position, Toast.LENGTH_SHORT).show(); 
       mCoverFlowClick.coverClick(position); 
      } 
     }); 

     return imageView; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((ImageView) object); 
    } 
} 

我加入了位圖陣列並調用notifydataset像這樣更改:

@Override 
    public void updateSongList(String songName) { 

     getBitmapArray(songName); 
     mCoverFlowAdapter.notifyDataSetChanged(); 

    } 

編輯:我的自定義佈局文件是

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <ImageView 
     android:id="@+id/coverFlowImage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

和我getBitmapArray功能

public void getBitmapArray(String songName) { 

     Bitmap bitmap = null; 
     path = Environment.getExternalStorageDirectory() + "/AppDownloads/" + songName; 
     File file = new File(path); 
     FileInputStream inputStream = null; 

     try { 
      inputStream = new FileInputStream(file.getAbsolutePath()); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

     try { 
      metaRetriver.setDataSource(inputStream.getFD()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     art = metaRetriver.getEmbeddedPicture(); 
     if (art != null) { 
      bitmap = BitmapFactory 
        .decodeByteArray(art, 0, art.length); 
     } 

     if (bitmap != null) { 
      mBitmapArray.add(bitmap); 
     } else { 
      Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.unknown_album); 
      mBitmapArray.add(icon); 
     } 
    } 
+0

V = inflater.inflate(R.layout.coverflow_item,容器,FALSE);嘗試這個。 –

+0

plz add ** getBitmapArray ** code –

+0

檢查我的編輯@RahulSharma – AbhayBohra

回答

1

: -

<ImageView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/coverFlowImage" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

在適配器: -

@Override 
public Object instantiateItem(ViewGroup container, final int position) { 

    LayoutInflater inflater= (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    ImageView imageView = (ImageView) inflater.inflate(R.layout.coverflow_item, container, false); 
    imageView.setImageBitmap(mBitmapArray.get(position)); 

    container.addView(imageView); 
    imageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(c, "Clicked::--" + position, Toast.LENGTH_SHORT).show(); 
      mCoverFlowClick.coverClick(position); 
     } 
    }); 

    return imageView; 
} 

如果你想使用的LinearLayout作爲ROOT然後,而不是添加的ImageView到容器的,添加膨脹的觀點,並在instantiateItem方法返回。

另外改變destroyItem方法

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    container.removeView(object); 
} 
+0

我將ImageView作爲父級佈局進行工作。 – AbhayBohra

0

看這裏:

imageView.setImageBitmap(mBitmapArray.get(position)); 
    container.addView(imageView); 
每一個要添加biotmap它的時候

將它添加到同一個容器中現在哪有那麼你需要刪除舊的視圖容器盛裝一個視圖可以添加其他在它:財產以後這樣

@Override 
public void updateSongList(String songName) { 

    getBitmapArray(songName); 
    container.removeView((ImageView) object) 
    mCoverFlowAdapter.notifyDataSetChanged(); 

} 

PS:爲了說明代碼,請確保ü傳遞正確PARAMS 讓我知道,如果有幫助:)

0

我最近實現了這個,這是我的instantiateItem方法(使它的可讀性有點微不足道。

@Override 
    public Object instantiateItem(View collection, int position) { 

    Evaluation evaluation = evaluations.get(position); 

    View layout = inflater.inflate(R.layout.layout_evaluation, null); 

    TextView evaluationSummary = (TextView) layout.findViewById(R.id.evaluation_summary); 

    evaluationSummary.setText(evaluation.getEvaluationSummary()); 

    ((ViewPager) collection).addView(layout); 

    return layout; 
} 

@Override 
public void destroyItem(View collection, int position, Object view) { 
    ((ViewPager) collection).removeView((View) view); 
} 

@Override 
public boolean isViewFromObject(View view, Object object) { 
    return view == object; 
} 

因此,對於顯示的頁面,我使用位置作爲索引從我的評估列表中獲取數據。然後膨脹有視圖的佈局,我也會添加我的數據。然後我得到TextView來設置評估摘要文本。然後整個Layout被添加到ViewPager。最後,佈局也會返回。

讓我知道,如果它可以幫助:)

+0

它給我同樣的執行 – AbhayBohra

+0

嘗試添加container.addView(imageView);並返回到v –

+0

其實我不使用片段..在我的活動中,我正在實現一個列表,給出下載的歌曲,並從中獲取位圖並將其添加到位圖數組使用getBitmapArray(songName) – AbhayBohra

1

在您的自定義佈局文件coverflow_item.xml包含ImageView了。

再次找你嘗試使用

container.addView(ImageView的)在同一容器中添加;

這就是爲什麼它拋出異常。

爲了克服它,你需要改變

container.addView(imageView); 

container.addView(v); 

而這一次也

return imageView; 

return v; 

編輯:

變化而不是使的LinearLayout作爲ImageView的的父母,讓ImageView的是佈局的ROOT如下這也

container.removeView((ImageView) object); 

container.removeView((LinearLayout)object) 
+0

它再次崩潰 – AbhayBohra

+0

在這行之前調用'container.removeAllViews()'container.addView(imageView );'然後用我的答案。 – Piyush

+0

它再次崩潰 – AbhayBohra

相關問題