2

我是viewpager的新手,我想使用viewpager创建视图,这里所有的东西都是动态的,所以我遵循这种方式,我的问题是instantiateItem()在创建时被调用了两次。
创建

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

    }
4

3 回答 3

3

这是在视图页面创建下一个视图并将其存储以从当前视图快速切换到下一个视图时调用它两次的行为,基本上它为当前视图创建其左右元素,以便您可以在起始页面向任何方向滚动页面因为没有左页,所以它只被调用两次。您还可以更改您想要创建和保留的视图数量,但总的来说,我认为最小(不确定但实际上有时会遇到)是 3

于 2014-05-27T09:36:48.867 回答
1

可能是您的 viewpager 嵌套在依赖于其他视图的视图组中(例如设置了 layout_weight 的 LinearLayout 或引用其他视图的 RelativeLayout 以计算其高度和/或宽度)?如果是这样,这可能是由于父视图的多个布局请求,因为它依赖于其他视图。如果这是原因,请尝试优化您的布局。

于 2013-03-13T12:21:27.293 回答
0

解决此问题的其他方法是覆盖getCount()定义要在寻呼机中加载的元素数量的方法。

 @Override
    public int getCount() {
       return NUMBER_OF_PAGES;
   }
于 2014-08-11T22:02:33.853 回答