11

के साथ IllegalStateException मुझे इस गतिविधि के भीतर एक IllegalStateException मिल रहा है लेकिन यह भी सुनिश्चित नहीं है कि क्या हो रहा है। QuickContactActivity में ViewPagerAdapter क्लास यहां है।पेजरएडाप्टर

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() फोन न:

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(); 
    } 
} 

यहाँ क्रैश लॉग है।

यदि आप संदेश पढ़ना जारी रखते हैं, तो कहता है कि 0 आइटमों की प्रतीक्षा करें और 1 प्राप्त करें। ऐसा लगता है कि एडाप्टर को प्राप्त करने वाले सभी आइटम/पृष्ठों सेट करने से पहले एडाप्टर सेट करें।

+0

हमें सूचित करना चाहिएडेटाडेटेड() विधि? –

+0

जब डेटा का आकार बदल गया। पहली बार आपको इसे बिल्कुल कॉल नहीं करना चाहिए। – Aracem

+0

क्या आप यह पोस्ट देख सकते हैं: http://stackoverflow.com/questions/17784476/viewpager-works-fine-at-first-time-but-after-click-on-button-got-error-java-lang –

1

मुझे आपके जैसी ही समस्याएं हैं, मेरे पास गतिविधि ए पर व्यूअरजर है, जब उपयोगकर्ता ने व्यूअरजर में आइटम पर क्लिक किया है, तो यह एक्टिविटी बी पर भी होगा, जिसमें दर्शक भी होगा। गतिविधि एक करने के लिए गतिविधि बी से उपयोगकर्ता वापस करने के बाद, इसे इस तरह अपवाद फेंक देगा:

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 

मुझे लगता है कि समस्या है, डेटा सामग्री है कि हमेशा 0 है viewpager के एडाप्टर क्योंकि एडाप्टर डेटा नहीं है कि गतिविधि से गुज़र गया।

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); 
      } 
     } 
    } 

} 

अब, इससे पहले अपवाद अब और नहीं दिखाएगा, और दर्शक सामान्य रूप से काम करता है। इस विधि को व्यूअरज़र को सूचीदृश्य की तरह करने का प्रयास करने की कोशिश की गई, क्योंकि सूचीदृश्य एडाप्टर के माध्यम से डेटा पास कर देगा, इसलिए एडाप्टर डाटा सामग्री को खो नहीं पाएगा, यहां तक ​​कि डेटा बदल गया है। मुझे उम्मीद है कि यह उदाहरण आपकी समस्याओं की मदद करेगा। चीयर्स।

-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