Android PagerAdapter没有调用instantiateItem

时间:2012-05-04 20:12:01

标签: android adapter

我正在尝试在我的应用中使用PagerAdapter实现ViewPager。我主要是在this example工作。

我的PagerAdapter名为DataPagerAdapter,并使用以下构造函数和instantiateItem,其中我从data_list_view.xml扩展了一个视图:

public class DataPagerAdapter extends PagerAdapter
    implements TitleProvider {
    private LayoutInflater mInflater;

    private static String[] titles = new String[]
    {
        "Page 1",
        "Page 2",
        "Page 3"
    };
    private final Context context;

    public DataPagerAdapter( Context context )
    {
        this.context = context;
    }

    @Override
    public String getTitle( int position )
    {
        return titles[ position ];
    }

    @Override
    public int getCount()
    {
        return titles.length;
    }

    @Override
    public Object instantiateItem( View pager, int position )
    {
        ListView v = (ListView) mInflater.inflate(R.layout.data_list_view, null);
        ((ViewPager)pager).addView( v, 0 );
        return v;
    }

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

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

    @Override
    public void finishUpdate( View view ) {}

    @Override
    public void restoreState( Parcelable p, ClassLoader c ) {}

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

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

在我的活动中,我得到了我的适配器:

DataPagerAdapter adapter = new DataPagerAdapter( this );

然后我想在代码中引用我的dataListView:

dataListView = (ListView) findViewById(R.id.listViewData);

问题是,dataListView调用返回findViewById为空,因为永远不会处理instantiateItem

何时调用instantiateItem并自动完成(如示例所示)或者我必须以某种方式强制它?

2 个答案:

答案 0 :(得分:23)

请注意,您的适配器使用弃用的方法:

public Object instantiateItem(View container, int position)
public void destroyItem(View container, int position, Object object)

API说使用这些代替:

public Object instantiateItem(ViewGroup container, int position)
public void destroyItem(ViewGroup container, int position, Object object)

答案 1 :(得分:2)

就我而言,问题是我错误地将ViewPager的可见性设置为GONE并且没有被调用。只需使viewPager可见性在布局中可见。