SORU
11 EYLÜL 2011, Pazar


ViewPager bir parçası olarak ListFragment güncelleme veri

Android v4 uyumluluk ViewPager kullanıyorum. Benim FragmentActivity benim ViewPager farklı sayfalarda farklı şekillerde görüntülenecek olan bir sürü veri var. Şimdiye kadar sadece aynı ListFragment 3 örneği var, ama gelecekte farklı ListFragments 3 örnekleri var. Bu ViewPager dikey bir telefon ekranında, listeleri yan yana değildir.

Şimdi ListFragment bir düğme verir tam sayfa ayrı bir aktivite (FragmentActivty), başlar ve FragentActivity veri değiştirir, kaydeder, onun ViewPager tüm görüşlerini güncelleştirmeye. Sıkışıp kaldım burada.

public class ProgressMainActivity extends FragmentActivity
{
    MyAdapter mAdapter;
    ViewPager mPager;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    ...
        mAdapter = new MyAdapter(getSupportFragmentManager());

        mPager = (ViewPager) findViewById(R.id.viewpager);
        mPager.setAdapter(mAdapter);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        ...
        updateFragments();
        ...
    }
    public void updateFragments()
    {
        //Attempt 1:
        //mAdapter.notifyDataSetChanged();
        //mPager.setAdapter(mAdapter);

        //Attempt 2:
        //HomeListFragment fragment = (HomeListFragment) getSupportFragmentManager().findFragmentById(mAdapter.fragId[0]);
        //fragment.updateDisplay();
    }

    public static class MyAdapter extends FragmentPagerAdapter implements
         TitleProvider
    {
      int[] fragId = {0,0,0,0,0};
      public MyAdapter(FragmentManager fm)
      {
         super(fm);
      }
      @Override
      public String getTitle(int position){
         return titles[position];
      }
      @Override
      public int getCount(){
         return titles.length;
      }

      @Override
      public Fragment getItem(int position)
      {

         Fragment frag = HomeListFragment.newInstance(position);
         //Attempt 2:
         //fragId[position] = frag.getId();
         return frag;
      }

      @Override
      public int getItemPosition(Object object) {
         return POSITION_NONE; //To make notifyDataSetChanged() do something
     }
   }

    public class HomeListFragment extends ListFragment
    {
    ...
        public static HomeListFragment newInstance(int num)
        {
            HomeListFragment f = new HomeListFragment();
            ...
            return f;
        }
   ...

Şimdi gördüğünüz gibi, benim ilk girişimdi için notifyDataSetChanged tüm FragmentPagerAdapter ve bu gösterdi güncelleme verileri bazen, ama diğerleri var bir İllegalStateException: değil gerçekleştirmek bu eylemden sonra onSaveİnstanceState.

Benim ikinci girişim güncelleme işlevini çağırmak için çalışıyorum benim ListFragment içinde involed, ama getıtem içinde getİd 0 döndürdü. Doktorların başı olarak çalıştım

FragmentManager gelen Parça için bir referans edinme, kullanma () findFragmentByİd veya findFragmentByTag()

ama benim Parçalarının etiket ya da kimliğini bilmiyorum! Ben bir android:id="@ id/viewpager" için ViewPager, ve bir android:id="@android:id/list" benim için liste Görünümü içinde ListFragment düzeni, ama sanmıyorum bunlar yararlı.

Yani, nasıl yapabilirim ya da bir güncelleştirme tüm viewpager güvenli bir şekilde tek bir seferde (ideal dönen kullanıcı sayfası vardı önce) - Tamam o kullanıcı görmek görünümünü değiştirmek. Ya da tercihen, b) etkilenen her ListFragment bir liste Görünümü işlevi el ile güncelleştirmek için arayın.

Herhangi bir yardım minnetle kabul olurdu!

CEVAP
12 EYLÜL 2011, PAZARTESİ


TAMAM, isteğini gerçekleştirmek b) bir yolunu buldum galiba başkalarıyla paylaşmak için. yani kendi sorumu' yarar. Bir ViewPager şeklinde "android:" nereye VİEWPAGER_İD R. kimliğidir.: VİEWPAGER_İD:DİZİN değiştirici içinde parçalarının etiketi XML düzeni ve DİZİN viewpager bu viewpager durum budur. Eğer pozisyonu biliniyorsa (örneğin 0), updateFragments içinde de yapabilirim():

      HomeListFragment fragment = 
          (HomeListFragment) getSupportFragmentManager().findFragmentByTag(
                       "android:switcher:" R.id.viewpager ":0");
      if(fragment != null)  // could be null if not instantiated yet
      {
         if(fragment.getView() != null) 
         {
            // no need to call if fragment's onDestroyView() 
            //has since been called.
            fragment.updateDisplay(); // do what updates are required
         }
      }

Eğer bunun için geçerli bir yol ise hiçbir fikrim yok, ama daha iyi bir şey önerdi kadar gelir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bunliu

    bunliu

    2 Mayıs 2007
  • FRED

    FRED

    1 EKİM 2005
  • Howard Pinsky

    Howard Pinsk

    6 AĞUSTOS 2006