2

ビューページャーを初めて使用します。ビューページャーを使用してビューを作成したいのですが、ここではすべてが動的であるため、この方法に従いました。私の問題は、作成時にinstantiateItem()が2回呼び出されることです。
オンクリエイト

{
    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

ビューページが次のビューを作成し、現在のビューから次のビューにすばやく切り替えるために保存するときに2回呼び出すのは、基本的に現在のビューの左右の要素を作成して、開始ページで任意の方向にページをスクロールできるようにする動作です。左ページがないため、2 回だけ呼び出されます。作成して状況に合わせて保持するビューの数を変更することもできますが、一般的には最小限 (確かではありませんが、実際に直面することもあります) は 3 だと思います

于 2014-05-27T09:36:48.867 に答える
1

ビューページャーが他のビューに依存するビューグループ内にネストされている可能性があります(たとえば、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 に答える