Android ViewPager Parça Sayfa çıkarın
Dinamik olarak eklemek ve bir ViewPager Parçaları, herhangi bir sorun olmadan çalışıyor ekleme kaldırmak için çalışıyorum, ama kaldırılması beklendiği gibi çalışmıyor.
Her zaman geçerli öğeyi kaldırmak istiyorum, sonuncusu da kaldırıldı.
Ben de adaptörün getİtemPosition yöntemi FragmentStatePagerAdapter veya dönüş POSİTİON_NONE kullanmaya çalıştı.
Neyi yanlış yapıyorum?
Burada temel bir örnek:
MainActivity.java
public class MainActivity extends FragmentActivity implements TextProvider {
private Button mAdd;
private Button mRemove;
private ViewPager mPager;
private MyPagerAdapter mAdapter;
private ArrayList<String> mEntries = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mEntries.add("pos 1");
mEntries.add("pos 2");
mEntries.add("pos 3");
mEntries.add("pos 4");
mEntries.add("pos 5");
mAdd = (Button) findViewById(R.id.add);
mRemove = (Button) findViewById(R.id.remove);
mPager = (ViewPager) findViewById(R.id.pager);
mAdd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
addNewItem();
}
});
mRemove.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
removeCurrentItem();
}
});
mAdapter = new MyPagerAdapter(this.getSupportFragmentManager(), this);
mPager.setAdapter(mAdapter);
}
private void addNewItem() {
mEntries.add("new item");
mAdapter.notifyDataSetChanged();
}
private void removeCurrentItem() {
int position = mPager.getCurrentItem();
mEntries.remove(position);
mAdapter.notifyDataSetChanged();
}
@Override
public String getTextForPosition(int position) {
return mEntries.get(position);
}
@Override
public int getCount() {
return mEntries.size();
}
private class MyPagerAdapter extends FragmentPagerAdapter {
private TextProvider mProvider;
public MyPagerAdapter(FragmentManager fm, TextProvider provider) {
super(fm);
this.mProvider = provider;
}
@Override
public Fragment getItem(int position) {
return MyFragment.newInstance(mProvider.getTextForPosition(position));
}
@Override
public int getCount() {
return mProvider.getCount();
}
}
}
TextProvider.java
public interface TextProvider {
public String getTextForPosition(int position);
public int getCount();
}
MyFragment.java
public class MyFragment extends Fragment {
private String mText;
public static MyFragment newInstance(String text) {
MyFragment f = new MyFragment(text);
return f;
}
public MyFragment() {
}
public MyFragment(String text) {
this.mText = text;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment, container, false);
((TextView) root.findViewById(R.id.position)).setText(mText);
return root;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@ id/add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="add new item" />
<Button
android:id="@ id/remove"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="remove current item" />
<android.support.v4.view.ViewPager
android:id="@ id/pager"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>
fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@ id/position"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="35sp" />
</LinearLayout>
CEVAP
Bu ViewPager bu belleğe birkaç kez (veya sizin durumunuzda parçaları) yükler çünkü kod parçaları yukarıda kaldırmaz. Görünen manzaraya ek olarak, aynı zamanda görünür bir iki tarafında görünüm yükler. Bu ViewPager bu kadar sakin yapan görünümler arasında yumuşak kaydırma sağlar.
İstediğiniz efekti elde etmek için, bir kaç şey yapman lazım.
Bir FragmentStatePagerAdapter için FragmentPagerAdapter değiştirin. Bunun nedeni FragmentPagerAdapter bu belleğe sonsuza kadar yüklenen tüm görüşlerini tutacak. Nerede FragmentStatePagerAdapter geçerli ve hem mekan hem de görüşleri dışında kalan görüşleri bulunmaktadır.
Adaptör yöntem getİtemPosition (aşağıda gösterilen) geçersiz kılar.
mAdapter.notifyDataSetChanged();
dediğimiz zaman ViewPager konumlandırma açısından nelerin değiştiğini belirlemek için adaptör sorguluyor. Her şey çok işleyemeyiz tüm görünüm konumlandırma değiştiğini söylemek için bu yöntemi kullanıyoruz.
Ve işte kodu
private class MyPagerAdapter extends FragmentStatePagerAdapter {
//... your existing code
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
}
Nasıl Android için bir ViewPager geçer...
Nasıl Parça ViewPager görünür olduğund...
KİMLİK, etiket, boş, ya da com için ba...
Bir ViewPager içinde yerini Parça...
Ve (kullanıcı oranı bizim app sor) İTu...