SORU
1 Mayıs 2012, Salı


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
1 Mayıs 2012, Salı


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.

  1. 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.

  2. 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;
    }

}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008
  • wwjoshdew

    wwjoshdew

    1 AĞUSTOS 2007