为什么instantiateItem不调用而Vie​​wPager不起作用?

时间:2014-08-13 17:10:56

标签: java android android-viewpager

我尝试用滑动图像制作简单的应用程序。我使用这篇文章http://www.androidbegin.com/tutorial/android-viewpager-gallery-images-and-texts-tutorial/

这是我的带有viewpager的xml: main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pages"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    </android.support.v4.view.ViewPager>

</LinearLayout>

这是我带图片的xml: item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/image"
        android:layout_gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

这是我的适配器: ViewerPagerAdapter.java

public class ViewerPagerAdapter extends PagerAdapter {

    private Context mContext;
    private ArrayList<CueModel> mArray;
    private LayoutInflater mInflater;
    private ImageView mImage;

    public ViewerPagerAdapter(Context _context){
        mContext = _context;

        mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


    public void setArray(ArrayList<Bitmap> arr){
        mArray = arr;
    }

    @Override
    public int getItemPosition(Object object) {  
        return POSITION_NONE;  
    }  

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
          View itemView = mInflater.inflate(R.layout.item, container, false);
          mImage = (ImageView)itemView.findViewById(R.id.image);
          mImage.setImageBitmap(mArray.get(position));
          container.addView(itemView);

          return itemView;
     }

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

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View)object);
    }

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

这是我的活动: OneActivity.java (mArrays充满图像)

public class OneActivity extends Activity {
    ArrayList<Bitmap> mArrays;
    ViewerPagerAdapter mAdapter;
    ViewPager mPager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main.xml);
        mPager = (ViewPager) findViewById(R.id.pages);
        mAdapter = new ViewerPagerAdapter(OneActivity.this);
        mAdapter.setArrays(mArrays);
        mPager.setAdapter(mAdapter);
    }
}

我不明白我做错了什么。 instantiateItem不会调用。

我的应用和

之间的PS.Difference

文章我有一些活动(我的arraylist由项目初始化) 谢谢

3 个答案:

答案 0 :(得分:9)

只要ViewPager需要新视图,就会调用

#instantiateItem()。最初,它会在中心的视图中调用#instantiateItem()两次,如果适配器的getCount() > 0则向右查看。这就是为什么在#setArray()方法中,每次更改数组时都需要调用#notifyDataSetChanged()。每次添加或删除列表中的项目时,还需要调用它。如果您的数组在#onCreate()中为空,那么#getCount() == 0以便ViewPager认为它是空的并且不会打扰。

答案 1 :(得分:2)

我知道这是一个非常古老的帖子,但我正在回答这个问题,有人会受益。我遇到了同样的问题 - instantiateItem ()没有被调用。 在尝试了这么多东西之后,我终于找到了我在代码中犯的错误,这是一个愚蠢的错误,我忘了将适配器设置为viewpager:

viewPager.setAdapter(adapter)

答案 2 :(得分:0)

对于错误消息所在的现代版本(2020 +)

二进制XML文件行#(lineNumber):膨胀类android.viewpager.widget.ViewPager时出错 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)

您可能要更新

android.support.v4.view.ViewPager到

androidx.viewpager.widget.ViewPager