11

我在此活動中收到IllegalStateException,但不太確定發生了什麼。這裏是QuickContactActivity中的ViewPagerAdapter類。IllegalStateException與PagerAdapter

private class ViewPagerAdapter extends FragmentPagerAdapter { 
    public ViewPagerAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     QuickContactListFragment fragment = new QuickContactListFragment(); 
     final String mimeType = mSortedActionMimeTypes.get(position); 
     final List<Action> actions = mActions.get(mimeType); 
     fragment.setActions(actions); 
     return fragment; 
    } 

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

這裏是崩潰日誌:

07-15 09:49:21.060: E/com.##.##.##.Application(12378): Thread uncaught exception: 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 1 Pager id: com.##.##.android:id/item_list_pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.##.contacts.quickcontact.QuickContactActivity$ViewPagerAdapter 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.support.v4.view.ViewPager.populate(ViewPager.java:959) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.support.v4.view.ViewPager.populate(ViewPager.java:911) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1432) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.View.measure(View.java:15518) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.View.measure(View.java:15518) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.View.measure(View.java:15518) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.View.measure(View.java:15518) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.View.measure(View.java:15518) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.View.measure(View.java:15518) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.Choreographer.doFrame(Choreographer.java:532) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.os.Handler.handleCallback(Handler.java:725) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.os.Looper.loop(Looper.java:137) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at android.app.ActivityThread.main(ActivityThread.java:5041) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at java.lang.reflect.Method.invokeNative(Native Method) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at java.lang.reflect.Method.invoke(Method.java:511) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
07-15 09:49:21.060: E/com.##.##.##.Application(12378): at dalvik.system.NativeStart.main(Native Method) 
07-15 09:49:21.060: E/ACRA(12378): ACRA caught a IllegalStateException exception for com.##.##.android. Building report. 
+0

調用'notifyDataSetChanged()'適配器上每一次一次的數據的大小變化。 – Raghunandan

+2

@Raghunandan:我應該在哪裏使用notifyDataSetChanged()方法? –

回答

15

的問題是,你的項目/頁列表中PageAdapter變化表明,你不要叫pageAdapter.notifyDataSetChanged()

如果您繼續閱讀該消息,說等待0個項目並獲得1.有了這個,看起來您在設置適配器接收的所有項目/頁面之前設置適配器。

+0

我們應該在哪裏使用notifyDataSetChanged()方法? –

+0

當數據的大小發生變化時。你第一次不應該這樣稱呼它。 – Aracem

+0

你能看到這篇文章:http://stackoverflow.com/questions/17784476/viewpager-works-fine-at-first-time-but-after-click-on-button-got-error-java-lang –

1

我有類似的問題,就像你做的,我有活動A的viewpager,然後當用戶點擊viewpager中的項目,它會去活動B有viewpager太。從活動B到活動的用戶回來後,​​它會拋出異常這樣的:

java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 4, found: 0 Pager id: com.gbu.app.templateforbussiness:id/header_view_pager_list Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.gbu.app.templateforbussiness.adapter.DetailProductPagerAdapter 

我認爲問題是,數據內容的viewpager的適配器必須始終爲0,因爲該適配器沒有數據從Activity中通過。所以,我想它像這個例子的工作:

DetailProductActivity.class

public class DetailProductActivity extends FragmentActivity { 
    private ViewPager product_detail_viewpager; 
    private DetailProductPagerAdapter detail_product_adapter; 
    private Intent product_detail_intent; 
    public static List<Product> detail_product; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_detail_product); 
     product_detail_viewpager = (ViewPager) findViewById(R.id.detail_product_viewpager); 
     detail_product = HomeActivity.home_product; 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     product_detail_intent = getIntent(); 
     startApp(product_detail_intent); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

    private void startApp(Intent data) { 
     // TODO Auto-generated method stub 
      // pass the Array, List of data to viewpager adapter like this 
     detail_product_adapter = new DetailProductPagerAdapter(getSupportFragmentManager(), detail_product); 
     product_detail_viewpager.setAdapter(detail_product_adapter); 
     product_detail_viewpager.setCurrentItem(data.getIntExtra("current_item", 0)); 
    } 

} 

而且viewpager的適配器: DetailProductPagerAdapter.class

public class DetailProductPagerAdapter extends FragmentPagerAdapter { 
    private ProductDetailFragment detail_product_fragment; 
    private Bundle data; 
    private List<Product> detail_product; 

    // the data from Activity passed to this adapter   
    public DetailProductPagerAdapter(FragmentManager fm, List<Product> p) { 
     super(fm); 
     // TODO Auto-generated constructor stub 
     detail_product = p; 
    } 

    // then passing the data again to your fragment class, like this example 
    @Override 
    public Fragment getItem(int arg0) { 
     // TODO Auto-generated method stub 
     detail_product_fragment = new ProductDetailFragment(detail_product); 
     data = new Bundle(); 
     data.putInt("current_item", arg0); 
     detail_product_fragment.setArguments(data); 
     return detail_product_fragment; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return detail_product.size(); 
    } 

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

} 

和碎片類: ProductDetailFragment.class

@SuppressLint("ValidFragment") 
public class ProductDetailFragment extends Fragment { 
    private RelativeLayout detail_item_header; 
    private ImageView detail_item_imv; 
    private TextView detail_item_tv_title; 
    private WebView detail_item_web_content; 
    private DisplayMetrics detail_metrics; 
    private List<Product> detail_product; 
    private int index_item; 

    // the data from adapter pass it to this fragment 
    public ProductDetailFragment(List<Product> p) { 
     detail_product = p; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view_detail = inflater.inflate(R.layout.item_product_detail_viewpager, container, false); 
     detail_metrics = new DisplayMetrics(); 
     getActivity().getWindowManager().getDefaultDisplay().getMetrics(detail_metrics); 
     savedInstanceState = getArguments(); 
     index_item = savedInstanceState.getInt("current_item"); 
     detail_item_header = (RelativeLayout) view_detail.findViewById(R.id.item_header_product_viewpager); 
     detail_item_imv = (ImageView) detail_item_header.findViewById(R.id.item_imv_product_viewpager); 
     detail_item_tv_title = (TextView) detail_item_header.findViewById(R.id.item_tv_title_product_viewpager); 
     detail_item_web_content = (WebView) view_detail.findViewById(R.id.item_web_product_viewpager); 
     startApp(); 
     return view_detail; 
    } 

    private void startApp() { 
     // TODO Auto-generated method stub 
     detail_item_header.getLayoutParams().height = (int) (detail_metrics.heightPixels * 0.38); 
     if (detail_product.get(index_item).getStatus() == 0) { 
      new loadImageProduct(detail_item_imv).execute(detail_product.get(index_item).getImage()); 
     }else { 
      detail_item_imv.setImageBitmap(detail_product.get(index_item).getBmp()); 
     } 
     detail_item_tv_title.setText(detail_product.get(index_item).getTitle()); 
     String web_content_product = "<!DOCTYPE html>"+ 
            "<html>"+ 
            "<body>"+ 
            "<p>Harga : "+detail_product.get(index_item).getPrice()+"</p><br>"+ 
            detail_product.get(index_item).getDetail()+"<br><br>"+ 
            detail_product.get(index_item).getDetail2()+ 
            "</body>"+ 
            "</html>"; 
     detail_item_web_content.loadDataWithBaseURL("https://www.google.com", web_content_product, "text/html", "UTF-8", null); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    private class loadImageProduct extends AsyncTask<String, Integer, Bitmap> { 
     private Bitmap b; 
     private ImageView vimv; 
     private GetImage get_image; 

     public loadImageProduct(ImageView v) { 
      vimv = v; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      b = null; 
      get_image = new GetImage(); 
     } 

     @Override 
     protected Bitmap doInBackground(String...url) { 
      try { 
       b = get_image.loadImageFromServer(url[0]); 
       if (b != null) 
        return b; 
      } catch(OutOfMemoryError e) { 

      } 
      return b; 
     } 

     @Override 
     protected void onPostExecute(Bitmap result) { 
      super.onPostExecute(result); 
      if (result != null) { 
       detail_product.get(index_item).setBmp(result); 
       detail_product.get(index_item).setStatus(1); 
       vimv.setImageBitmap(result); 
      } 
     } 
    } 

} 

現在,它將不再顯示的異常,以及viewpager正常工作。這個方法試圖讓viewpager像listview一樣,因爲listview將通過適配器傳遞數據,所以即使數據已經改變,適配器也不會丟失數據內容。我希望這個例子能幫助你解決問題。乾杯。

-1

它發生在我身上時,我試圖重寫頁適配器

的getCount將()在授權,我只顯示一個頁面。授權結束後我改變頁面計數至3。它屬於我,如果我不叫InvalidatePageAdapter()

@Override 
public int getCount() { 

    if (mAuthorization_Status == AUTH_STATUS.AUTH_SUCCESS) { 

     if (!isRefreshed) { 
      isRefreshed = true; 
      this.notifyDataSetChanged(); 
     } 

     return NUM_PAGES; 

    } else { 

     return 1; 
     //return NUM_PAGES; 

    } 

} // END: getCount 
相關問題