Search code examples
androidandroid-viewpagerandroid-pageradapter

PagerAdapter class instantiateItem getting called twice automatically in onCreate


I am new with viewpager, i want to create view using viewpager, here all the things are dynamic, so i followed this way, My problem is that instantiateItem() is getting called twice oncreate.
Oncreate

{
    pager = (ViewPager) findViewById(R.id.panelPager);
    adapter = new MyPagerAdapter();     
    pager.setAdapter(adapter);
}
public class MyPagerAdapter extends PagerAdapter {

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

            Log.d("Pos",""+position);
            //PagerView = new View(collection.getContext());
            LayoutInflater inflater = (LayoutInflater) collection.getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            PagerView = inflater.inflate(R.layout.newmainviewpager, null, false);
            lvMenu=(ListView)PagerView.findViewById(R.id.lvMenuItem);
            imgMainItem=(ImageView)PagerView.findViewById(R.id.imgDisplay);
            addMenuItemAdapter.clear();
            addMenuItemAdapter.notifyDataSetChanged();
            addMenuItemAdapter.notifyDataSetInvalidated();
            String str[][] = datasource.GetSubMenuDetailsFromMenuId(MenuIdlst
                    .get(position).trim());
            Log.d("Str", "" + str.length);
            SubMnuIdlst.clear();
            SubMnuNamelst.clear();
            ArabicSubMnulst.clear();
            TypeIdlst.clear();
            TypeNamelst.clear();
            for (int i = 0; i < str.length; i++) {

                SubMnuIdlst.add(""+str[i][0]);
                SubMnuNamelst.add(""+str[i][2]);
                ArabicSubMnulst.add(""+str[i][3]);
                Log.d("SubMenuId",""+str[i][0]);
                Log.d("SubMenuName",""+str[i][2]);
                Log.d("SubMenuNameArabicMenu",""+str[i][3]);
            }
            String [][]TypeDetails=datasource.GetTypeDetailsFromMenuId(MenuIdlst.get(position));
            for (int i = 0; i < TypeDetails.length; i++) {
                TypeIdlst.add(TypeDetails[i][0]);
                TypeNamelst.add(TypeDetails[i][3]);
                Log.d("TypeId",""+TypeDetails[i][0]);
                Log.d("TypeName",""+TypeDetails[i][3]);

            }

            for(int i=0;i<SubMnuIdlst.size();i++)
            {
                //Pricelst.clear();
                for(int j=0;j<TypeIdlst.size();j++)
                {
                    String Price=datasource.getPriceFromSubMenuIdAndTypeId(TypeIdlst.get(j),SubMnuIdlst.get(i));
                    //Pricelst.add(Price);      
                    Log.d("Adaper",MenuIdlst.get(i)+","+SubMnuIdlst.get(i)+","+SubMnuNamelst.get(i)+","+
                            TypeIdlst.get(j)+","+TypeNamelst.get(j)+","+Price);
                    addMenuItemAdapter.add(MenuIdlst.get(i)+","+SubMnuIdlst.get(i)+","+SubMnuNamelst.get(i)+","+
                                        TypeIdlst.get(j)+","+TypeNamelst.get(j)+","+Price);
                }
            }

            byte[] photo =datasource.getImagePathFromSubMenuId(SubMnuIdlst.get(position));
            ByteArrayInputStream imageStream = new ByteArrayInputStream(photo);
            Bitmap theImage= BitmapFactory.decodeStream(imageStream);
            Bitmap bitmapScaled = Bitmap.createScaledBitmap(theImage, 100,80, true);
            Drawable drawable = new BitmapDrawable(bitmapScaled);
            imgMainItem.setBackgroundDrawable(drawable);

            lvMenu.setAdapter(addMenuItemAdapter);

            ((ViewPager) collection).addView(PagerView, 0);
            return PagerView;

        }

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


/**
 * Determines whether a page View is associated with a specific key object
 * as returned by instantiateItem(ViewGroup, int). This method is required
 * for a PagerAdapter to function properly.
 * @param view Page View to check for association with object
 * @param object Object to check for association with view
 * @return
 */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == ((View) object);
        }


    /**
     * Called when the a change in the shown pages has been completed.  At this
     * point you must ensure that all of the pages have actually been added or
     * removed from the container as appropriate.
     * @param arg0 The containing View which is displaying this adapter's
     * page views.
     */
        @Override
        public void finishUpdate(ViewGroup arg0) {}


        @Override
        public void restoreState(Parcelable arg0, ClassLoader arg1) {}

        @Override
        public Parcelable saveState() {
                return null;
        }

        @Override
        public void startUpdate(ViewGroup arg0) {}
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return  MenuIdlst.size();
        }

    }

Solution

  • Could it be that your viewpager is nested inside a view group which depends on other views (e.g. LinearLayout with layout_weight set or a RelativeLayout with references to other views in order to calculate its height and/or width)? If so this could be due to multiple layout requests of the parent view since it depends on other views. If this is the cause than try to optimize your layout.