android - 对 ViewPager 的 PagerAdapter 有误解。 InstantianteItem 方法永远不会被调用

标签 android android-viewpager android-pageradapter

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

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

这是寻呼机将存在的 Activity 的 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() 没有被调用。任何有用的想法将不胜感激。

最佳答案

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>
        ...
    
  • Activity 课
    @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 目录下

    关于android - 对 ViewPager 的 PagerAdapter 有误解。 InstantianteItem 方法永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14213218/

    相关文章:

    android - 如何更改 ViewPagerIndicator 的动画

    android - 屏幕方向更改后从 ViewPager 的适配器中销毁项目

    java - 为什么我在使用 Retrofit 和 GSON 转换器映射的对象属性上得到空值?

    java - Dagger 错误 : Can't inject a non-static inner class

    android - 在android中显示具有轮播效果的图像

    android - 更改 ViewPager 的顺序并更新 View

    android - 手动将 View 添加到 View 寻呼机

    android - PagerAdapter 中的 MapFragment

    android - 如何相对于 RelativeLayout 中的多个 View 对齐 View ?

    java - 适配器实例与 ListView 一起消失在 fragment 中