java PagerAdapter的一个实现,可以动态添加或删除视图。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java PagerAdapter的一个实现,可以动态添加或删除视图。相关的知识,希望对你有一定的参考价值。

[Ref.1](http://stackoverflow.com/questions/13664155/dynamically-add-and-remove-view-to-viewpager)

[Ref.2](http://blog.csdn.net/dreamzml/article/details/9951577)
public class MainPagerAdapter extends PagerAdapter {
	// This holds all the currently displayable views, in order from left to right.
	private ArrayList<View> views = new ArrayList<View>();

	
	// Used by ViewPager. "Object" represents the page; tell the ViewPager where
	// the
	// page should be displayed, from left-to-right. If the page no longer
	// exists,
	// return POSITION_NONE.
	@Override
	public int getItemPosition(Object object) {
		int index = views.indexOf(object);
		if (index == -1) {
			return POSITION_NONE;
		} else {
			return index;
		}
	}

	// Used by ViewPager. Called when ViewPager needs a page to display; it is
	// our job
	// to add the page to the container, which is normally the ViewPager itself.
	// Since
	// all our pages are persistent, we simply retrieve it from our "views"
	// ArrayList.
	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		View v = views.get(position);
		container.addView(v);
		
		return v;
	}

	// Used by ViewPager. Called when ViewPager no longer needs a page to
	// display; it
	// is our job to remove the page from the container, which is normally the
	// ViewPager itself. Since all our pages are persistent, we do nothing to
	// the
	// contents of our "views" ArrayList.
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		container.removeView(views.get(position));
	}

	// Used by ViewPager; can be used by app as well.
	// Returns the total number of pages that the ViewPage can display. This
	// must
	// never be 0.
	@Override
	public int getCount() {
		return views.size();
	}

	// Used by ViewPager.
	@Override
	public boolean isViewFromObject(View view, Object object) {
		return view == object;
	}

	// Add "view" to right end of "views".
	// Returns the position of the new view.
	// The app should call this to add pages; not used by ViewPager.
	public int addView(View v) {
		return addView(v, views.size());
	}

	// Add "view" at "position" to "views".
	// Returns position of new view.
	// The app should call this to add pages; not used by ViewPager.
	public int addView(View v, int position) {
		views.add(position, v);

		return position;
	}

	// Removes "view" from "views".
	// Retuns position of removed view.
	// The app should call this to remove pages; not used by ViewPager.
	public int removeView(ViewPager pager, View v) {
		return removeView(pager, views.indexOf(v));
	}

	// -----------------------------------------------------------------------------
	// Removes the "view" at "position" from "views".
	// Retuns position of removed view.
	// The app should call this to remove pages; not used by ViewPager.
	public int removeView(ViewPager pager, int position) {
		// ViewPager doesn't have a delete method; the closest is to set the
		// adapter
		// again. When doing so, it deletes all its views. Then we can delete
		// the view
		// from from the adapter and finally set the adapter to the pager again.
		// Note
		// that we set the adapter to null before removing the view from "views"
		// - that's
		// because while ViewPager deletes all its views, it will call
		// destroyItem which
		// will in turn cause a null pointer ref.
		pager.setAdapter(null);
		views.remove(position);
		pager.setAdapter(this);

		return position;
	}

	// Returns the "view" at "position".
	// The app should call this to retrieve a view; not used by ViewPager.
	public View getView(int position) {
		return views.get(position);
	}

	// Other relevant methods:

	// finishUpdate - called by the ViewPager - we don't care about what pages
	// the
	// pager is displaying so we don't use this method.
}
public class MainActivity extends Activity {
	private ViewPager pager = null;
	private MainPagerAdapter pagerAdapter = null;

	
	@Override
	public void onCreate (Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
    
		setContentView (R.layout.main_activity);

		// ... do other initialization, such as create an ActionBar ...

		pagerAdapter = new MainPagerAdapter();
		pager = (ViewPager) findViewById (R.id.view_pager);
		pager.setAdapter (pagerAdapter);
		
		// Create an initial view to display; must be a subclass of FrameLayout.
		LayoutInflater inflater = context.getLayoutInflater();
		FrameLayout v0 = (FrameLayout) inflater.inflate (R.layout.one_of_my_page_layouts, null);
		pagerAdapter.addView (v0, 0);
	}

	// Here's what the app should do to add a view to the ViewPager.
	public void addView(View newPage) {
		int pageIndex = pagerAdapter.addView(newPage);
		// You might want to make "newPage" the currently displayed page:
		pager.setCurrentItem(pageIndex, true);
	}
	
	// Here's what the app should do to remove a view from the ViewPager.
	public void removeView(View defunctPage) {
		int pageIndex = pagerAdapter.removeView(pager, defunctPage);
		
		// You might want to choose what page to display, if the current page
		// was "defunctPage".
		if (pageIndex == pagerAdapter.getCount()) pageIndex--;
		
		pager.setCurrentItem(pageIndex);
	}
	
	// Here's what the app should do to get the currently displayed page.
	public View getCurrentPage() {
		return pagerAdapter.getView(pager.getCurrentItem());
	}
	
	// Here's what the app should do to set the currently displayed page.
	// "pageToShow" must
	// currently be in the adapter, or this will crash.
	public void setCurrentPage(View pageToShow) {
		pager.setCurrentItem(pagerAdapter.getItemPosition(pageToShow), true);
	}
}

以上是关于java PagerAdapter的一个实现,可以动态添加或删除视图。的主要内容,如果未能解决你的问题,请参考以下文章

PagerAdapter相关

Java.lang.IllegalStateException:应用程序PagerAdapter更改了适配器的内容而不调用PagerAdapter#notifyDataSetChanged andro

Android开发技巧——PagerAdapter实现类的封装

Android中PagerAdapter总结

PagerAdapter 的问题

Android 实现多个视频和多个图片一起轮播+PagerAdapter的功能