ViewPager के हिस्से के रूप में ListFragment में डेटा अपडेट करें


142

मैं Android में v4 संगतता ViewPager का उपयोग कर रहा हूं। मेरी FragmentActivity में डेटा का एक समूह है, जिसे मेरे ViewPager में विभिन्न पृष्ठों पर विभिन्न तरीकों से प्रदर्शित किया जाना है। अभी तक मेरे पास एक ही ListFragment के 3 उदाहरण हैं, लेकिन भविष्य में मेरे पास अलग-अलग ListFragments के 3 उदाहरण होंगे। ViewPager एक वर्टिकल फोन स्क्रीन पर है, लिस्ट अगल-बगल नहीं हैं।

अब ListFragment पर एक बटन एक अलग पूर्ण-पृष्ठ गतिविधि (FragmentActivity के माध्यम से) शुरू करता है, जो रिटर्न और FragmentActivity डेटा को संशोधित करता है, इसे बचाता है, फिर इसके ViewPager में सभी विचारों को अपडेट करने का प्रयास करता है। यह यहां है, जहां मैं फंस गया हूं।

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

अब जैसा कि आप देख सकते हैं, मेरा पहला प्रयास अधिसूचित किया गया था कि पूरे FragmentPagerAdapter पर DataSetChanged, और यह कभी-कभी डेटा को अपडेट करने के लिए दिखाया गया था, लेकिन दूसरों को मुझे एक IllegalStateException मिली: onSaveInstanceState के बाद यह कार्रवाई नहीं कर सकता।

मेरे दूसरे प्रयास ने अपनी ListFragment में अपडेट फ़ंक्शन को कॉल करने की कोशिश की, लेकिन getIem में getId वापस आ गया। 0. डॉक्स के अनुसार मैंने कोशिश की

FragmentManager से Fragment का संदर्भ प्राप्त करना, findFragmentById () या findFragmentByTag () का उपयोग करके

लेकिन मुझे अपने फ्रैगमेंट्स का टैग या आईडी पता नहीं है! मेरे पास ViewPager के लिए एक android: id = "@ + id / viewpager" है, और ListFragment लेआउट में मेरे ListView के लिए एक android: id = "@ android: id / list" है, लेकिन मुझे नहीं लगता कि ये उपयोगी हैं।

तो, मैं या तो कैसे कर सकता हूं: ए) एक बार में पूरे व्यू पेज को सुरक्षित रूप से अपडेट करें (आदर्श रूप से उपयोगकर्ता को उस पृष्ठ पर वापस लौटा दें) - यह ठीक है कि उपयोगकर्ता को दृश्य परिवर्तन दिखाई देता है। या अधिमानतः, बी) मैन्युअल रूप से सूची दृश्य को अपडेट करने के लिए प्रत्येक प्रभावित ListFragment में एक फ़ंक्शन को कॉल करें।

कोई मदद कृतज्ञता स्वीकार किया जाएगा!

जवाबों:


58

प्रत्येक बार एक फ्रिगेशन त्वरित होने पर टैग रिकॉर्ड करने का प्रयास करें।

public class MPagerAdapter extends FragmentPagerAdapter {
    private Map<Integer, String> mFragmentTags;
    private FragmentManager mFragmentManager;

    public MPagerAdapter(FragmentManager fm) {
        super(fm);
        mFragmentManager = fm;
        mFragmentTags = new HashMap<Integer, String>();
    }

    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public Fragment getItem(int position) {
        return Fragment.instantiate(mContext, AFragment.class.getName(), null);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Object obj = super.instantiateItem(container, position);
        if (obj instanceof Fragment) {
            // record the fragment tag here.
            Fragment f = (Fragment) obj;
            String tag = f.getTag();
            mFragmentTags.put(position, tag);
        }
        return obj;
    }

    public Fragment getFragment(int position) {
        String tag = mFragmentTags.get(position);
        if (tag == null)
            return null;
        return mFragmentManager.findFragmentByTag(tag);
    }
}

यह ठीक है, लेकिन यह मेरी कक्षा में काम नहीं करता है। क्या यह आपके साथ काम करता है? मैं अभी भी nullटुकड़े के लिए मिलता है।
सैंडलोन 15'12

1
यह मेरे लिए काम करता है, मैंने कई परियोजनाओं में इसका इस्तेमाल किया। आप FragmentPagerAdapter के स्रोत कोड को पढ़ने और डीबग करने के लिए कुछ लॉग मुद्रित करने का प्रयास कर सकते हैं।
फेयलॉन

धन्यवाद स्क्रीन को घुमाने के बाद भी एक आकर्षण की तरह काम करता है। हालांकि, मैं इस समाधान का उपयोग करके FragmentB से MyActivity का उपयोग करके FragmentA की सामग्री को बदलने में सक्षम था।
मेहदी फनाई

5
यह के लिए काम करता FragmentPagerAdaperहै, लेकिन के लिए विफल रहता है FragmentStatePagerAdaper( Fragment.getTag()हमेशा वापसी null
इंजन बाई

1
मैंने इस समाधान की कोशिश की, टुकड़े के डेटा को अपडेट करने के लिए एक विधि बनाई। लेकिन अब मैं टुकड़े के विचारों को देखने में सक्षम नहीं हूं। मैं देख सकता हूं कि डेटा खंडित हो रहा है लेकिन दृश्य दिखाई नहीं दे रहे हैं। कोई मदद?
अरुण बडोले

256

बर्कसाइड का जवाब इसके साथ काम करता है, FragmentPagerAdapterलेकिन इसके साथ काम नहीं करता है FragmentStatePagerAdapter, क्योंकि यह उन टुकड़ों पर टैग सेट नहीं करता है जिनसे यह गुजरता है FragmentManager

साथ FragmentStatePagerAdapterऐसा लगता है हम, द्वारा प्राप्त अपने का उपयोग कर सकते हैं instantiateItem(ViewGroup container, int position)कॉल। यह स्थिति में खंडन के संदर्भ देता है position। यदि FragmentStatePagerAdapterपहले से ही विखंडन का संदर्भ है, तो instantiateItemकेवल उस टुकड़े का संदर्भ देता है, और getItem()इसे फिर से इंस्टेंट करने के लिए नहीं कहता है।

तो, मान लीजिए, मैं वर्तमान में # 50 टुकड़े देख रहा हूं, और खंड # 49 पर पहुंचना चाहता हूं। चूंकि वे करीब हैं, इसलिए एक अच्छा मौका है # 49 पहले से ही त्वरित होगा। इसलिए,

ViewPager pager = findViewById(R.id.viewpager);
FragmentStatePagerAdapter a = (FragmentStatePagerAdapter) pager.getAdapter();
MyFragment f49 = (MyFragment) a.instantiateItem(pager, 49)

5
मैं इसे सरल बनाकर "a" पेजर एडेप्टर (पेजर एडेप्टर ए = पेजरगेट एडाप्टर (;);) बना सकता हूं। या यहां तक ​​कि MyFragment f49 = (MyFragment) pager.getAdapter ()। InstantiateItem (पेजर, 49); InstantiateItem () पेजर एडेप्टर से है, इसलिए आपको इसे तत्काल टाइप करने के लिए टाइप करने की जरूरत नहीं है। ()
Dandre Allison

12
... और अगर किसी को आश्चर्य हो रहा है, तो ViewPager देखे गए टुकड़े के सूचकांक का ट्रैक रखता है (ViewPager.getCurrentItem ()), जो कि ऊपर दिए गए उदाहरण में 49 है ... लेकिन मैंने कहा होगा कि मैं मैं यह देख रहा हूं कि ViewPager API सीधे वास्तविक Fragment का संदर्भ नहीं लौटाएगा।
mblackwell8

6
@ Mblackwell8 द्वारा प्रस्तावित FragmentStatePagerAdapterके साथ a.instantiateItem(viewPager, viewPager.getCurrentItem());(49 से छुटकारा पाने के लिए) उपरोक्त कोड का उपयोग करने के साथ , पूरी तरह से काम करता है।
सेड्रिक साइमन

1
रुको, इसलिए मुझे प्रत्येक टुकड़े में व्यूपेजर को पास करना होगा, जिसमें सिर्फ टुकड़े में विचारों को करने में सक्षम होना है? वर्तमान में मैं वर्तमान पृष्ठ पर onCreate में जो कुछ भी करता हूं वह अगले पृष्ठ पर होता है। यह बेहद छायादार लीक-वार लगता है।
G_V

यह उल्लेख करना महत्वपूर्ण है कि किसी भी कॉल को / कॉल से instantiateItemघिरा होना चाहिए । विवरण मेरे ऐसे ही प्रश्न के उत्तर में हैं: stackoverflow.com/questions/14035090/…startUpdatefinishUpdate
morgwai

154

ठीक है, मुझे लगता है कि मैंने अपने प्रश्न में अनुरोध बी) करने का एक तरीका पाया है ताकि मैं दूसरों के लाभ के लिए साझा करूं। एक ViewPager अंदर टुकड़े की टैग रूप में है "android:switcher:VIEWPAGER_ID:INDEX", जहां VIEWPAGER_IDहै R.id.viewpagerएक्सएमएल लेआउट में, और सूचकांक viewpager में स्थिति है। इसलिए यदि स्थिति ज्ञात है (उदाहरण 0), तो मैं इसमें प्रदर्शन कर सकता हूं updateFragments():

      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
         }
      }

मुझे नहीं पता कि यह करने का एक वैध तरीका है, लेकिन यह तब तक करेगा जब तक कुछ बेहतर करने का सुझाव नहीं दिया जाता।


4
मैंने आपके उत्तर और प्रश्न को केवल +1 में लॉग इन किया।
23

5
चूंकि यह आधिकारिक दस्तावेज में नहीं है, मैं इसका उपयोग नहीं करूंगा। क्या होगा अगर वे भविष्य में रिलीज़ में टैग बदलते हैं?
थिएरी-दिमित्री रॉय

4
FragmentPagerAdapter एक स्थैतिक विधि के साथ आता है जिसका makeFragmentNameउपयोग टैग को उत्पन्न करने के लिए किया जाता है जिसे आप थोड़े कम- HomeListFragment fragment = (HomeListFragment) getSupportFragmentManager().findFragmentByTag(FragmentPagerAdapter.makeFragmentName(R.id.viewpager, 0));
हैक

8
@dgmltn, makeFragmentNameहै private staticविधि, ताकि आप इसे करने के लिए उपयोग नहीं कर सकते।
स्टेनवीएन

1
यीशु की प्यारी माँ यह काम करती है! मैं बस अपनी उंगली को पार करके रखूँगा और इसका उपयोग करूँगा।
बोगडान अलेक्जेंड्रू

35

यदि आप मुझसे पूछते हैं, तो नीचे के पृष्ठ पर दूसरा समाधान, सभी "सक्रिय" खंड पृष्ठों पर नज़र रखना बेहतर है: http://tamsler.blogspot.nl/2011/11/android-viewpager-and-fragments-part -ii.html

बर्कसाइड का जवाब मेरे लिए बहुत ज्यादा खतरनाक है।

आप सभी "सक्रिय" खंड पृष्ठों पर नज़र रखते हैं। इस स्थिति में, आप FragmentStatePagerAdapter में टुकड़े पृष्ठ का ट्रैक रखते हैं, जिसका उपयोग ViewPager द्वारा किया जाता है।

private final SparseArray<Fragment> mPageReferences = new SparseArray<Fragment>();

public Fragment getItem(int index) {
    Fragment myFragment = MyFragment.newInstance();
    mPageReferences.put(index, myFragment);
    return myFragment;
}

"निष्क्रिय" खंड पृष्ठों के संदर्भ को रखने से बचने के लिए, हमें FragmentStatePagerAdapter के विध्वंस (...) विधि को लागू करने की आवश्यकता है:

public void destroyItem(View container, int position, Object object) {
    super.destroyItem(container, position, object);
    mPageReferences.remove(position);
}

... और जब आपको वर्तमान में दिखाई देने वाले पृष्ठ तक पहुंचने की आवश्यकता हो, तो आप कॉल करें:

int index = mViewPager.getCurrentItem();
MyAdapter adapter = ((MyAdapter)mViewPager.getAdapter());
MyFragment fragment = adapter.getFragment(index);

... जहां MyAdapter की getFragment (int) विधि इस तरह दिखती है:

public MyFragment getFragment(int key) {
    return mPageReferences.get(key);
}

"


@ लिंक में दूसरा समाधान सरल है ... धन्यवाद! :)
TheFlash

3
बेहतर है अगर आप एक नक्शे के बजाय एक SparseArray का उपयोग करते हैं
GaRRaPeTa


मेरे जवाब को अपडेट किया गया ताकि यह एक स्पैर्सएयर का उपयोग करता है, यदि आप <11 को लक्षित करते हैं, तो इसके बजाय स्पार्सअयरकॉम.कॉम का उपयोग करें क्योंकि कक्षा 11 में अपडेट किया गया वर्ग 11.
फ्रैंक

2
यह जीवनचक्र की घटनाओं पर ब्रेक लगाएगा। देखें stackoverflow.com/a/24662049/236743
डोरी

13

ठीक है, ऊपर @barkside द्वारा विधि का परीक्षण करने के बाद, मैं अपने आवेदन के साथ काम करने के लिए इसे प्राप्त नहीं कर सका। तब मुझे याद आया कि IOSched2012 ऐप एक viewpagerअच्छी तरह से उपयोग करता है , और यहीं पर मुझे अपना समाधान मिला। यह किसी भी टुकड़ा आईडी या टैग का उपयोग नहीं करता है क्योंकि ये viewpagerआसानी से सुलभ तरीके से संग्रहीत नहीं होते हैं ।

यहाँ IOSched apps HomeActivity के महत्वपूर्ण भाग दिए गए हैं। टिप्पणी पर विशेष रूप से ध्यान दें , क्योंकि इसमें मुख्य है:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // Since the pager fragments don't have known tags or IDs, the only way to persist the
    // reference is to use putFragment/getFragment. Remember, we're not persisting the exact
    // Fragment instance. This mechanism simply gives us a way to persist access to the
    // 'current' fragment instance for the given fragment (which changes across orientation
    // changes).
    //
    // The outcome of all this is that the "Refresh" menu button refreshes the stream across
    // orientation changes.
    if (mSocialStreamFragment != null) {
        getSupportFragmentManager().putFragment(outState, "stream_fragment",
                mSocialStreamFragment);
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    if (mSocialStreamFragment == null) {
        mSocialStreamFragment = (SocialStreamFragment) getSupportFragmentManager()
                .getFragment(savedInstanceState, "stream_fragment");
    }
}

और Fragmentsइस FragmentPagerAdapterतरह से आप के उदाहरणों को संग्रहीत करें:

    private class HomePagerAdapter extends FragmentPagerAdapter {
    public HomePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return (mMyScheduleFragment = new MyScheduleFragment());

            case 1:
                return (mExploreFragment = new ExploreFragment());

            case 2:
                return (mSocialStreamFragment = new SocialStreamFragment());
        }
        return null;
    }

इसके अलावा, अपनी Fragmentकॉल को ऐसे संरक्षित करना याद रखें :

    if (mSocialStreamFragment != null) {
        mSocialStreamFragment.refresh();
    }

रयान, क्या यह कहना है कि आप उन कार्यों को देख रहे हैं जिनका उपयोग ViewPager आपके टुकड़े के उदाहरणों को 'रखने' के लिए करता है और उन्हें एक सार्वजनिक चर पर सेट करता है जो कि प्रशंसनीय है? पुनर्स्थापना के उदाहरण पर आपके पास क्या है अगर (mSocialStreamFragment == null) {?
थॉमस क्लोसे

1
यह एक अच्छा जवाब है और io12 ऐप रेफरी के लिए +1 - अनिश्चित है यदि यह जीवनचक्र परिवर्तनों पर काम करेगा, क्योंकि जीवनचक्र परिवर्तन के कारण getItem()माता-पिता के फिर से तैयार होने के बाद नहीं बुलाया जाएगा। देखें stackoverflow.com/a/24662049/236743 । उदाहरण में यह एक टुकड़े के लिए आंशिक रूप से संरक्षित है लेकिन अन्य दो नहीं
डोरी

2

आप FragmentPagerAdapterकुछ स्रोत कोड को कॉपी और संशोधित कर सकते हैं , getTag()विधि जोड़ सकते हैं

उदाहरण के लिए

public abstract class AppFragmentPagerAdapter extends PagerAdapter {
private static final String TAG = "FragmentPagerAdapter";
private static final boolean DEBUG = false;

private final FragmentManager mFragmentManager;
private FragmentTransaction mCurTransaction = null;
private Fragment mCurrentPrimaryItem = null;

public AppFragmentPagerAdapter(FragmentManager fm) {
    mFragmentManager = fm;
}


public abstract Fragment getItem(int position);

@Override
public void startUpdate(ViewGroup container) {
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }

    final long itemId = getItemId(position);


    String name = getTag(position);
    Fragment fragment = mFragmentManager.findFragmentByTag(name);
    if (fragment != null) {
        if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
        mCurTransaction.attach(fragment);
    } else {
        fragment = getItem(position);
        if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);

        mCurTransaction.add(container.getId(), fragment,
                getTag(position));
    }
    if (fragment != mCurrentPrimaryItem) {
        fragment.setMenuVisibility(false);
        fragment.setUserVisibleHint(false);
    }

    return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }
    if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
            + " v=" + ((Fragment) object).getView());
    mCurTransaction.detach((Fragment) object);
}

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    Fragment fragment = (Fragment) object;
    if (fragment != mCurrentPrimaryItem) {
        if (mCurrentPrimaryItem != null) {
            mCurrentPrimaryItem.setMenuVisibility(false);
            mCurrentPrimaryItem.setUserVisibleHint(false);
        }
        if (fragment != null) {
            fragment.setMenuVisibility(true);
            fragment.setUserVisibleHint(true);
        }
        mCurrentPrimaryItem = fragment;
    }
}

@Override
public void finishUpdate(ViewGroup container) {
    if (mCurTransaction != null) {
        mCurTransaction.commitAllowingStateLoss();
        mCurTransaction = null;
        mFragmentManager.executePendingTransactions();
    }
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return ((Fragment) object).getView() == view;
}

@Override
public Parcelable saveState() {
    return null;
}

@Override
public void restoreState(Parcelable state, ClassLoader loader) {
}


public long getItemId(int position) {
    return position;
}

private static String makeFragmentName(int viewId, long id) {
    return "android:switcher:" + viewId + ":" + id;
}

protected abstract String getTag(int position);
}

फिर इसे विस्तारित करें, इन सार पद्धति को ओवरराइड करें, एंड्रॉइड ग्रुप परिवर्तन से डरने की आवश्यकता नहीं है

FragmentPageAdapter भविष्य में स्रोत कोड

 class TimeLinePagerAdapter extends AppFragmentPagerAdapter {


    List<Fragment> list = new ArrayList<Fragment>();


    public TimeLinePagerAdapter(FragmentManager fm) {
        super(fm);
        list.add(new FriendsTimeLineFragment());
        list.add(new MentionsTimeLineFragment());
        list.add(new CommentsTimeLineFragment());
    }


    public Fragment getItem(int position) {
        return list.get(position);
    }

    @Override
    protected String getTag(int position) {
        List<String> tagList = new ArrayList<String>();
        tagList.add(FriendsTimeLineFragment.class.getName());
        tagList.add(MentionsTimeLineFragment.class.getName());
        tagList.add(CommentsTimeLineFragment.class.getName());
        return tagList.get(position);
    }


    @Override
    public int getCount() {
        return list.size();
    }


}

1

समस्याओं के बिना भी काम करता है:

पृष्ठ के टुकड़े के लेआउट में कहीं:

<FrameLayout android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone" android:id="@+id/fragment_reference">
     <View android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>
</FrameLayout>

टुकड़ा में onCreateView ():

...
View root = inflater.inflate(R.layout.fragment_page, container, false);
ViewGroup ref = (ViewGroup)root.findViewById(R.id.fragment_reference);
ref.setTag(this);
ref.getChildAt(0).setTag("fragment:" + pageIndex);
return root;

और विधि ViewPager से टुकड़ा लौटने के लिए, अगर मौजूद है:

public Fragment getFragment(int pageIndex) {        
        View w = mViewPager.findViewWithTag("fragment:" + pageIndex);
        if (w == null) return null;
        View r = (View) w.getParent();
        return (Fragment) r.getTag();
}

1

वैकल्पिक रूप से आप इस तरह setPrimaryItemसे विधि को ओवरराइड कर सकते हैं FragmentPagerAdapter:

public void setPrimaryItem(ViewGroup container, int position, Object object) { 
    if (mCurrentFragment != object) {
        mCurrentFragment = (Fragment) object; //Keep reference to object
        ((MyInterface)mCurrentFragment).viewDidAppear();//Or call a method on the fragment
    }

    super.setPrimaryItem(container, position, object);
}

public Fragment getCurrentFragment(){
    return mCurrentFragment;
}

0

मैं अपना दृष्टिकोण देना चाहता हूं यदि यह किसी और की मदद कर सकता है:

यह मेरा पेजर एडेप्टर है:

 public class CustomPagerAdapter extends FragmentStatePagerAdapter{
    private Fragment[] fragments;

    public CustomPagerAdapter(FragmentManager fm) {
        super(fm);
        fragments = new Fragment[]{
                new FragmentA(),
                new FragmentB()
        };
    }

    @Override
    public Fragment getItem(int arg0) {
        return fragments[arg0];
    }

    @Override
    public int getCount() {
        return fragments.length;
    }

}

मेरी गतिविधि में मेरे पास है:

public class MainActivity {
        private ViewPager view_pager;
        private CustomPagerAdapter adapter;


        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = new CustomPagerAdapter(getSupportFragmentManager());
        view_pager = (ViewPager) findViewById(R.id.pager);
        view_pager.setAdapter(adapter);
        view_pager.setOnPageChangeListener(this);
          ...
         }

}

फिर वर्तमान टुकड़ा पाने के लिए जो मैं करता हूं वह है:

int index = view_pager.getCurrentItem();
Fragment currentFragment = adapter.getItem(index);

1
यह गतिविधि / खंड जीवन चक्र के तरीकों के बाद टूट जाएगा
डोरी

0

यह मेरा समाधान है क्योंकि मुझे अपने टैब का ट्रैक रखने की आवश्यकता नहीं है और उन्हें वैसे भी ताज़ा करने की आवश्यकता है।

    Bundle b = new Bundle();
    b.putInt(Constants.SharedPreferenceKeys.NUM_QUERY_DAYS,numQueryDays);
    for(android.support.v4.app.Fragment f:getSupportFragmentManager().getFragments()){
        if(f instanceof HomeTermFragment){
            ((HomeTermFragment) f).restartLoader(b);
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.