【问题标题】:Have misunderstanding with PagerAdapter for ViewPager. InstantianteItem method never gets called对 ViewPager 的 PagerAdapter 有误解。 InstantiateItem 方法永远不会被调用
【发布时间】:2013-01-08 10:45:21
【问题描述】:

这是我用于分页的简单 PagerAdapter 和 onCreate() 活动。

public class MPagerAdapter extends PagerAdapter{

    List<ViewGroup> pages = null;

    public MPagerAdapter(List<ViewGroup> pages){
        this.pages = pages;
    }

    @Override
    public Object instantiateItem(ViewGroup collection, int position){
        ViewGroup v = pages.get(position);
        ((ViewPager) collection).addView(v, 0);
        return v;
    }

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

    @Override
    public int getCount(){
        return pages.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object){
        return view.equals(object);
    }

    @Override
    public void finishUpdate(View arg0){
    }

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

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

    @Override
    public void startUpdate(View arg0){
    }
}

这是寻呼机将在其中生存的活动的 onCreate()。

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pager);
    getActionBar().setDisplayHomeAsUpEnabled(true);

    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    amount=Integer.parseInt(message);

    Resources res = getResources();
    Drawable background =  res.getDrawable(R.drawable.page_back1);

    BackgroudImage bImage = new BackgroudImage(x, y, background);

    List<MyLayout> pages = new ArrayList<MyLayout>();
    int a = amount/bImage.mPointsList.size();
    for (int i=0; i<=a; i++){
        MyLayout page = new MyLayout(getBaseContext(), bImage);     
        page.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        pages.add(page);
    }
    MPagerAdapter pagerAdapter = new MPagerAdapter(pages);
    ViewPager viewPager = (ViewPager)findViewById(R.id.pager);//new ViewPager(this);
    viewPager.setAdapter(pagerAdapter);
    viewPager.setCurrentItem(1); 
}

我的自定义布局的 OnLayout() 方法,用作 pagerView 页面的控件

protected void onLayout(boolean changed, int l, int t, int r, int b) {
    if (PagerActivity.amount<=points.size()) {

        for (int i=0; i<PagerActivity.amount; i++){
            ImageView childV = new ImageView(super.getContext());
            childV.setBackgroundResource(R.drawable.lesson_frame_closed);
            ViewGroup.LayoutParams imageParams = new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            childV.setOnClickListener(new View.OnClickListener() {

                  @Override
                  public void onClick(View view) {

                  }

                });
            this.addView(childV, imageParams);
        }
        PagerActivity.amount=0;
    } 

    if ((float)(bgrImage.getBackground().getIntrinsicWidth())/(float)(bgrImage.getBackground().getIntrinsicHeight())<(float)this.getMeasuredWidth()/(float)this.getMeasuredHeight()) {
        scaleFX=(float)this.getMeasuredHeight()/(float)bgrImage.getBackground().getIntrinsicWidth();
        scaleFY=(float)this.getMeasuredHeight()/(float)bgrImage.getBackground().getIntrinsicHeight();
    } else {
        scaleFX=(float)this.getMeasuredWidth()/(float)bgrImage.getBackground().getIntrinsicWidth();
        scaleFY=(float)this.getMeasuredWidth()/(float)bgrImage.getBackground().getIntrinsicHeight();
    }

    for (int i = 0; i < getChildCount(); i++) {
        final View childV = getChildAt(i);
        if (childV.getVisibility() != View.VISIBLE)
        continue;
        childV.layout((int)(points.get(i).getOriginX()*scaleFX), (int)(points.get(i).getOriginY()*scaleFY), childV.getWidth(), childV.getHeight());
    }

}

不明白为什么没有调用 InstantiateItem()。任何有用的想法将不胜感激。

【问题讨论】:

    标签: android android-viewpager android-pageradapter


    【解决方案1】:

    ViewPagerView,应该添加到 UI。通常通过在布局文件中声明它。

    从 SDK 示例中提取:

    • 布局文件:

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:gravity="center_horizontal"
          android:orientation="vertical"
          android:padding="4dip" >
      
          <android.support.v4.view.ViewPager
              android:id="@+id/pager"
              android:layout_width="match_parent"
              android:layout_height="0px"
              android:layout_weight="1" >
          </android.support.v4.view.ViewPager>
          ...
      
    • 活动类

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.fragment_pager);
      
          mAdapter = new MyAdapter(getSupportFragmentManager());
      
          mPager = (ViewPager)findViewById(R.id.pager);
          mPager.setAdapter(mAdapter);
          ...
      

    完整的源码在 SDK 的 extras/android/support/samples/Support4Demos 目录中

    【讨论】:

    • ViewPager 是一个视图列表。它不能在布局文件中声明,必须声明分页器(视图)的页面,并且它们在我的项目中声明。但我不明白为什么 InstantiateItem 没有被调用
    • 应该声明ViewPager而不是页面:viewpager 要求适配器在需要时创建它们。基本上它就像 ListView 一样工作:您声明 ListView ,然后将子创建委托给适配器。
    • SDK 的 Support4Demos 示例项目中有示例。
    • ViewPager viewPager = new ViewPager(this); viewPager.setAdapter(pagerAdapter); 如果你看到这种方式,我会在我的代码中声明 ViewPager 并设置一个适配器
    • 好的,但是如果ViewPager 没有链接到 UI,它就无法知道何时调用适配器。您可以手动执行此操作,但标准方法是在布局中声明它。我添加了一个例子。希望这会对你有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多