2013-03-11 52 views
1
自动调用两次

我是新与viewpager,我想用viewpager,这里所有的东西都是动态创建视图,所以我也跟着这样一来,我的问题是instantiateItem()获取调用两次OnCreate中。
的OnCreatePagerAdapter类instantiateItem得到中的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(); 
     } 

    } 
+0

请帮帮我.. – hemant 2013-03-11 07:13:08

+0

嗨,任何解决方案吗? – pallavi 2016-02-09 10:07:00

回答

1

难道你viewpager嵌套取决于其它视图的视图组内(例如LinearLayout中与layout_weight集合或以计算它的高度与至其它视图的引用一个RelativeLayout的和/或宽度)?如果是这样,这可能是由于父视图的多个布局请求,因为它取决于其他视图。如果这是造成问题的原因,请尝试优化布局。

+1

这是不正确的! ViewPager始终在init中调用适配器两次。位置0和1.缓存下一个视图并执行平滑过渡。分页时,您将看到适配器总是被下一个索引调用到当前位置。 – 2015-04-02 12:58:54

+0

我们不知道的问题,如果“叫了两声”叫用0和1表示的话,那是正常的ViewPager行为,或0两次,那么它可以作为这个答案意味着是一个布局的问题。 – brillenheini 2015-11-08 10:47:11

3

它的行为称之为两倍查看页面使其下一个视图,并将其存储从目前快速切换到下一个,基本上它使当前视图的左边和右边元素,让你可以在任何方向滚动页面,在起始页面,因为没有左页面,这就是为什么它只被调用两次。 您还可以更改您要创建并保持情况,但一般没有意见,我觉得最少的(不知道,但实际上面临着一些时间)是3

+0

这就是这里的真正原因。我讨厌试图保存当前pos以便从选择中获取资源的PageAdapter。这是个坏主意,因为ViewPager总是提前缓存下一个视图。这是我的证明。 – 2015-04-02 12:55:25

+0

@ReneM。 ü如何解决的我也面临着同样的问题 – Erum 2015-06-18 19:42:51

+0

@Erum你不能改变这种行为,但你可以调用ViewPager的onPageChangeListner特定片段的方法,你知道哪个片段在哪个位置。 – 2015-06-20 08:20:40

0

来解决,这是压倒一切的getCount()方法定义其他方式在寻呼机内加载的元素数量。

@Override 
    public int getCount() { 
     return NUMBER_OF_PAGES; 
    }