После выяснения, какие методы ViewPager вызываются ViewPager, а какие для других целей, я нашел решение. Я представляю это здесь, так как вижу, что многие люди боролись с этим, и я не видел других соответствующих ответов.
Во-первых, вот мой адаптер; надеюсь, комментарии в коде достаточны:
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.
}
А вот несколько фрагментов кода, показывающих, как использовать адаптер.
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);
pagerAdapter.notifyDataSetChanged();
}
//-----------------------------------------------------------------------------
// 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);
}
}
Наконец, вы можете использовать следующее для вашего activity_main.xml
макета:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</android.support.v4.view.ViewPager>
Я искал простое решение для динамического удаления видов из окна просмотра (без фрагментов). Таким образом, если у вас есть какая-то информация, которой принадлежат ваши страницы, вы можете установить для нее флажок «Просмотреть как тег». Просто так (код адаптера):
Вам просто нужно удалить свою информацию из mMessages, а затем вызвать
notifyDataSetChanged()
ваш адаптер. Плохая новость: в этом случае нет анимации.источник
Есть довольно много дискуссий по этой теме
Хотя мы видим это часто, использование
POSITION_NONE
, кажется, не является подходящим способом, поскольку это очень неэффективно с точки зрения памяти.Здесь, в этом вопросе, мы должны рассмотреть использование подхода Альваро :
Вот SO ответ с кодом, основанным на этой идее
источник
Я сделал похожую программу. надеюсь, это поможет вам. В первом упражнении можно выбрать четыре сеточных данных. В следующем упражнении есть пейджер просмотра, который содержит две обязательные страницы. И там будут еще 4 страницы, которые будут видны в соответствии с выбранными данными сетки.
Следующее является mainactivty MainActivity
Здесь TabFragment1, TabFragment2 и т. Д. - это фрагменты, которые должны отображаться в окне просмотра. И я не показываю макеты, поскольку они находятся за рамками этого проекта.
MainActivity будет стремиться к Main2Activity Main2Activity
ViewPagerAdapter Viewpageradapter.class
Макет для main2activity acticity_main2.xml
Надеюсь, это поможет кому-то ... Нажмите кнопку вверх, пожалуйста, если это помогло вам
источник
Вот альтернативное решение этого вопроса. Мой адаптер:
Код для удаления и добавления динамически
По совету Peri Hartman, он начал работать после того, как я установил null do адаптер ViewPager и снова установил адаптер после удаления представлений. До этого на странице 0 не отображалось содержимое списка.
Спасибо.
источник
Я создал собственную библиотеку PagerAdapters для динамического изменения элементов в PagerAdapters.
С помощью этой библиотеки вы можете динамически изменять элементы, как описано ниже.
Библиотека Thils также поддерживает страницы, созданные Fragments.
источник
Для удаления вы можете использовать это напрямую:
fragment
это фрагмент, который вы хотите удалить.источник
Я нашел хорошее решение для этой проблемы, это решение может заставить его работать, и нет необходимости воссоздавать фрагменты.
Мой ключевой момент:
Исходный код
Код у меня на Github Gist .
источник