Setelah mencari tahu metode ViewPager mana yang dipanggil oleh ViewPager dan yang untuk tujuan lain, saya datang dengan solusi. Saya menyajikannya di sini karena saya melihat banyak orang telah berjuang dengan ini dan saya tidak melihat jawaban yang relevan lainnya.
Pertama, ini adaptor saya; semoga komentar dalam kode sudah cukup:
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.
}
Dan inilah beberapa cuplikan kode yang menunjukkan cara menggunakan adaptor.
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);
}
}
Akhirnya, Anda dapat menggunakan yang berikut ini untuk activity_main.xml
tata letak Anda :
<?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>
Saya mencari solusi sederhana untuk menghapus tampilan dari viewpager (tidak ada fragmen) secara dinamis. Jadi, jika Anda memiliki beberapa info, yang menjadi milik halaman Anda, Anda dapat mengaturnya menjadi Lihat sebagai tag. Sama seperti itu (kode adaptor):
Anda hanya perlu menghapus info Anda dari mMessages, dan kemudian memanggil
notifyDataSetChanged()
adaptor Anda. Berita buruk tidak ada animasi dalam kasus ini.sumber
Ada beberapa diskusi seputar topik ini
Meskipun kita sering melihatnya, menggunakan
POSITION_NONE
tampaknya tidak menjadi cara untuk pergi karena sangat tidak efisien dari segi memori.Di sini, di pertanyaan ini, kita harus mempertimbangkan menggunakan pendekatan Alvaro :
Berikut adalah jawaban SO dengan kode berdasarkan ide ini
sumber
Saya melakukan program serupa. harap ini akan membantu Anda. Dalam aktivitas pertamanya, empat data kotak dapat dipilih. Pada aktivitas berikutnya, ada pager tampilan yang berisi dua halaman wajib. Dan 4 halaman lagi akan ada di sana, yang akan terlihat sesuai dengan data kisi yang dipilih.
Berikut adalah MainAktivitas mainactivty
Di sini TabFragment1, TabFragment2 dll adalah fragmen untuk ditampilkan pada viewpager. Dan saya tidak menunjukkan tata letak karena mereka berada di luar ruang lingkup proyek ini.
MainActivity akan bermaksud untuk Main2Activity Main2Activity
ViewPagerAdapter Viewpageradapter.class
Layout untuk main2activity acticity_main2.xml
Semoga ini bisa membantu seseorang ... Klik tombol tolong jika ini membantu Anda
sumber
Inilah solusi alternatif untuk pertanyaan ini. Adaptor saya:
Kode untuk dihapus dan ditambahkan secara dinamis
Setelah saran dari Peri Hartman, mulai berfungsi setelah saya mengatur null do ViewPager adapter dan meletakkan adaptor lagi setelah pandangan dihapus. Sebelum ini, halaman 0 tidak menunjukkan konten daftar.
Terima kasih.
sumber
Saya telah membuat perpustakaan PagerAdapters khusus untuk mengubah item di PagerAdapters secara dinamis.
Anda dapat mengubah item secara dinamis seperti mengikuti dengan menggunakan perpustakaan ini.
Perpustakaan Thils juga mendukung halaman yang dibuat oleh Fragmen.
sumber
Untuk menghapus Anda dapat menggunakan ini secara langsung:
fragment
adalah fragmen yang ingin Anda hapus.sumber
Saya menemukan solusi yang bagus untuk masalah ini, solusi ini dapat membuatnya berfungsi dan tidak perlu membuat ulang Fragmen.
Poin kunci saya adalah:
Kode sumber
Kode ada di Github Gist saya .
sumber