2013-03-11 48 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; 
    }