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的一个实现,可以动态添加或删除视图。的主要内容,如果未能解决你的问题,请参考以下文章
Java.lang.IllegalStateException:应用程序PagerAdapter更改了适配器的内容而不调用PagerAdapter#notifyDataSetChanged andro