ভিউপ্যাজারের অংশ হিসাবে তালিকাফ্র্যাগমেন্টে ডেটা আপডেট করুন


142

আমি অ্যান্ড্রয়েডে v4 সামঞ্জস্যতা ভিউপেজার ব্যবহার করছি। আমার ফ্র্যাগমেন্টএকটিভিটির একটি গুচ্ছ ডেটা রয়েছে যা আমার ভিউপিজারে বিভিন্ন পৃষ্ঠায় বিভিন্ন উপায়ে প্রদর্শিত হবে। এখনও অবধি আমার কাছে একই লিস্টফ্র্যাগমেন্টের মাত্র 3 টি উদাহরণ রয়েছে, তবে ভবিষ্যতে আমার কাছে বিভিন্ন তালিকাগুলির 3 টি উদাহরণ থাকবে। ভিউপ্যাজারটি একটি উল্লম্ব ফোনের স্ক্রিনে রয়েছে, তালিকাগুলি পাশাপাশি থাকা নয়।

এখন লিস্টফ্র্যাগমেন্টের একটি বোতাম একটি পৃথক পূর্ণ পৃষ্ঠা ক্রিয়াকলাপ শুরু করে (ফ্রেগমেন্টএকটিভিটির মাধ্যমে), যা ফেরত দেয় এবং ফ্রেগমেন্টএক্টিভিটি ডেটা পরিবর্তন করে, সংরক্ষণ করে, তারপরে তার ভিউপাগারে সমস্ত দর্শন আপডেট করার চেষ্টা করে। এখানেই আমি আটকা পড়েছি।

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

এখন আপনি দেখতে পাচ্ছেন, আমার প্রথম প্রয়াসটি পুরো ফ্রেগমেন্টপেজার অ্যাডাপ্টারে ডেটাসেট চেঞ্জ করা ছিল এবং এটি কখনও কখনও ডেটা আপডেট করার বিষয়টি দেখিয়েছিল, তবে অন্যদের কাছে আমি একটি অবৈধ স্টেট এক্সেপশন পেয়েছি: onSaveInstanceState এর পরে এই ক্রিয়াটি সম্পাদন করতে পারবেন না।

আমার দ্বিতীয় প্রয়াসটি আমার লিস্টফ্র্যাগমেন্টে একটি আপডেট ফাংশন কল করার চেষ্টা করে, তবে getId এ আইটেমটি ফিরে আসে 0 আমি যে ডক দ্বারা চেষ্টা করেছি সে অনুসারে

ফ্রেগমেন্টম্যানেজারের কাছ থেকে ফ্রেগমেন্টবিয়ানআইডি () বা ফাইন্ডফ্রেগমেন্টবাইট্যাগ () ব্যবহার করে ফ্রেগমেন্টের রেফারেন্স অর্জন করা

তবে আমি আমার খণ্ডগুলির ট্যাগ বা আইডি জানি না! আমার কাছে একটি অ্যান্ড্রয়েড রয়েছে: ভিউপ্যাজারের জন্য আইডি = "@ + আইডি / ভিউপ্যাজার" এবং একটি অ্যান্ড্রয়েড: আইডি = "@ অ্যান্ড্রয়েড: আইডি / তালিকা" আমার তালিকাভুক্তির জন্য তালিকাফ্র্যাগমেন্ট লেআউটে, তবে আমি মনে করি এগুলি দরকারী কিনা।

সুতরাং, আমি কীভাবে পারি: ক) একযোগে পুরো ভিউপিজারকে নিরাপদে আপডেট করুন (আদর্শভাবে ব্যবহারকারীকে তার আগে যে পৃষ্ঠায় ছিলেন সেটিতে ফিরিয়ে দেওয়া) - ব্যবহারকারীটির দৃষ্টিভঙ্গি দেখতে এটি ঠিক আছে। অথবা পছন্দসইভাবে, খ) তালিকাভুক্তিকে ম্যানুয়ালি আপডেট করতে প্রতিটি ক্ষতিগ্রস্থ তালিকাফ্র্যাগমেন্টে একটি ফাংশন কল করুন।

কোন সাহায্য কৃতজ্ঞভাবে গৃহীত হবে!

উত্তর:


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টুকরা জন্য পেতে ।
স্যান্ডেলন

1
এটি আমার জন্য কাজ করে, আমি এটি বেশ কয়েকটি প্রকল্পে ব্যবহার করেছি। আপনি ফ্রেগমেন্টপেজারএডাপ্টারের উত্স কোডটি পড়ার চেষ্টা করতে পারেন এবং ডিবাগ করার জন্য কিছু লগ মুদ্রণ করতে পারেন।
ফায়লন

ধন্যবাদ স্ক্রিনগুলি ঘোরানোর পরেও মনোযোগের মতো কাজ করে ven তবে আমি এই সমাধানটি ব্যবহার করে ফ্রেগমেন্টবি থেকে মাইএকটিভিটি ব্যবহার করে ফ্রেগমেন্টএর সামগ্রী পরিবর্তন করতে সক্ষম হয়েছি।
মেহেদী ফানাই

5
এটা তোলে জন্য কাজ করে FragmentPagerAdaperকিন্তু ব্যর্থ হয় FragmentStatePagerAdaper( Fragment.getTag()সবসময় আসতে null
ইঞ্জিন বাই

1
আমি এই সমাধানটি চেষ্টা করেছি, খণ্ডের ডেটা আপডেট করার জন্য একটি পদ্ধতি তৈরি করেছি। তবে এখন আমি খণ্ডের দৃশ্য দেখতে পাচ্ছি না not আমি দেখতে পাচ্ছি যে ডেটা খণ্ডে যাচ্ছে কিন্তু ভিউগুলি দৃশ্যমান নয়। কোন সাহায্য?
অরুণ বদোল

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 = পেজারজেটএডাপ্টার ();) তৈরি করে এটিকে সহজ করব। অথবা মাইফ্রেগমেন্ট f49 = (মাইফ্রেগমেন্ট) পেজআরগেটএডাপ্টার ()। ইনস্ট্যান্টিয়েট আইটেম (পেজার, 49); ইনস্ট্যান্টিয়েট
আইটেম

12
... এবং কেবল যদি কেউ ভাবতে থাকে তবে ভিউপ্যাজারটি দেখা খণ্ডের সূচকটি (ভিউপেজারজিটক্রেনারআইটেম ()) রাখে, যা উপরের উদাহরণে 49 টি ... তবে আমি বলতে চাই যে আমি আমি আশ্চর্য হয়েছি যে ভিউপ্যাজার এপিআই সরাসরি আসল টুকরাটির কোনও রেফারেন্স সরাসরি ফিরিয়ে দেবে না।
এমব্ল্যাকওয়েল 8

6
সঙ্গে FragmentStatePagerAdapterসঙ্গে উপরের কোড ব্যবহার a.instantiateItem(viewPager, viewPager.getCurrentItem());হিসাবে @ mblackwell8 দ্বারা প্রস্তাবিত (49 পরিত্রাণ পেতে) পুরোপুরি কাজ করে।
সিড্রিক সাইমন

1
অপেক্ষা করুন, সুতরাং আমাকে খণ্ডের দর্শনগুলিতে কিছু করতে সক্ষম হবার জন্য প্রতিটি খণ্ডে ভিউপ্যাজারটি পাস করতে হবে? বর্তমান পৃষ্ঠায় অনক্রিটে আমি বর্তমানে যা কিছু করি তা পরবর্তী পৃষ্ঠায় ঘটে। এটি অত্যন্ত ছায়াময় লিক-বুদ্ধিযুক্ত শোনায়।
G_V

এটি উল্লেখ করা গুরুত্বপূর্ণ যে যে কোনও কলকে / কল instantiateItemঘিরে থাকতে হবে । : বিবরণ একটি অনুরূপ প্রশ্নের আমার উত্তর আছে stackoverflow.com/questions/14035090/...startUpdatefinishUpdate
morgwai

154

ঠিক আছে, আমার মনে হয় আমি অনুরোধ সম্পাদন করার একটি উপায় খুঁজে পেয়েছি খ) নিজের প্রশ্নে যাতে আমি অন্যের উপকারে ভাগ করে নিই। একটি ViewPager ভিতরে টুকরা ট্যাগ আকারে হয় "android:switcher:VIEWPAGER_ID:INDEX", যেখানে VIEWPAGER_IDহয় R.id.viewpagerএক্সএমএল বিন্যাস, এবং এর INDEX 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 করতে লগ ইন করেছি।
স্যুটআপ

5
যেহেতু এটি অফিসিয়াল ডকুমেন্টেশনে নেই, আমি এটি ব্যবহার করব না। তারা যদি ভবিষ্যতে প্রকাশে ট্যাগটি পরিবর্তন করে?
থিয়েরি-দিমিত্রি রায়

4
ফ্রেগমেন্টপেজারএডাপ্টারটি এমন একটি স্ট্যাটিক পদ্ধতি নিয়ে আসে makeFragmentNameযা ট্যাগটি তৈরি করতে ব্যবহৃত হয় যা আপনি পরিবর্তে কিছুটা কম-হ্যাকি পদ্ধতির জন্য ব্যবহার করতে পারেন: HomeListFragment fragment = (HomeListFragment) getSupportFragmentManager().findFragmentByTag(FragmentPagerAdapter.makeFragmentName(R.id.viewpager, 0));
ডিজিএমল্টন

8
@ ডিজিএমল্টন, makeFragmentNameএটি একটি private staticপদ্ধতি, যাতে আপনি এটিতে অ্যাক্সেস পেতে পারেন না।
স্টেনাভিএন

1
যিশুর মিষ্টি মা এই কাজ! আমি কেবল আমার আঙুলটি ক্রস করে রাখব এবং এটি ব্যবহার করব।
বোগদান আলেকজান্দ্রু

35

আপনি যদি আমাকে জিজ্ঞাসা করেন, নীচের পৃষ্ঠায় দ্বিতীয় সমাধান, সমস্ত "সক্রিয়" খণ্ড পৃষ্ঠার উপর নজর রাখা, আরও ভাল: http://tamsler.blogspot.nl/2011/11/android-viewpager-and-frations-part -ii.html

বার্কসাইডের উত্তর আমার কাছে খুব হ্যাকি।

আপনি সমস্ত "সক্রিয়" খণ্ড পৃষ্ঠার উপর নজর রাখেন। এই ক্ষেত্রে, আপনি ফ্র্যাগমেন্টস্টেটপেজারএডাপ্টারে খণ্ডিত পৃষ্ঠাগুলি ট্র্যাক করে রাখুন যা ভিউপ্যাজার দ্বারা ব্যবহৃত হয়।

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

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

"নিষ্ক্রিয়" টুকরা পৃষ্ঠাগুলির রেফারেন্স এড়াতে, আমাদের ফ্র্যাগমেন্টস্টেটপেজারএডাপ্টারের ধ্বংস আইটেম (...) পদ্ধতিটি প্রয়োগ করতে হবে:

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);

... যেখানে মাইএডাপ্টারের গেটফ্রেগমেন্ট (ইনট) পদ্ধতিটি দেখায়:

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

"


লিঙ্কটিতে @ ফ্র্যাঙ্কের দ্বিতীয় সমাধানটি সহজ ...! ধন্যবাদ .. :)
TheFlash

3
যদি আপনি কোনও মানচিত্রের পরিবর্তে স্পার্সআরে ব্যবহার করেন তবে ভাল
গআআরআপাপিটা


আমার উত্তরটি আপডেট করেছে যাতে এটি স্পার্সআরেই ব্যবহার করে, যদি আপনি <11 টি টার্গেট করেন তবে পরিবর্তে একটি স্পার্সআরয় কমপ্যাট ব্যবহার করুন কারণ শ্রেণি 11 সংস্করণে কী আপডেট হয়েছে
ফ্র্যাঙ্ক

2
এটি জীবনচক্র সংক্রান্ত ইভেন্টগুলিতে বিরতি পাবে। দেখুন stackoverflow.com/a/24662049/236743
Dori

13

ঠিক আছে, উপরের বারকসাইড দ্বারা পদ্ধতিটি পরীক্ষা করার পরে, আমি এটি আমার অ্যাপ্লিকেশনটির সাথে কাজ করতে পারি না। তারপরে আমি মনে রেখেছিলাম যে আইওএসচেড ২০১২ অ্যাপ্লিকেশনটিviewpager পাশাপাশি ব্যবহার করে এবং আমিই আমার সমাধানটি খুঁজে পেয়েছি। এটি কোনও খণ্ড আইডি বা ট্যাগ ব্যবহার করে না কারণ এগুলি viewpagerসহজেই অ্যাক্সেসযোগ্য উপায়ে সংরক্ষণ করা হয় না।

আইওএসড অ্যাপস হোমঅ্যাক্টিভিটি থেকে গুরুত্বপূর্ণ অংশগুলি এখানে । মন্তব্যটিতে বিশেষ মনোযোগ দিন , কারণ এতে কী রয়েছে:

@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();
    }

রায়ান, আপনি কি এই কথাটি বলতে চাইছেন যে ভিউপ্যাজারটি আপনার খণ্ডের দৃষ্টান্তগুলি 'রাখার' জন্য এবং সেগুলি অ্যাক্সেসযোগ্য এমন একটি পাবলিক ভেরিয়েবলটিতে সেট করার জন্য ব্যবহার করে? পুনরুদ্ধারের উদাহরণে কেন আপনার কাছে যদি (এমসোসিয়াল স্ট্রিমফ্র্যাগমেন্ট == নাল) থাকে {?
থমাস ক্লোয়েস 15

1
io12 অ্যাপ্লিকেশন রেফার জন্য এটি একটি দুর্দান্ত উত্তর এবং +1 - নিশ্চিত নয় যে এটি যদি আজীবন চক্র পরিবর্তনের কারণে getItem()পিতামাতার পুনর্বাসনের পরে ডাকা না হওয়ার কারণে জীবনকালক্রমে পরিবর্তনগুলি জুড়ে কাজ করবে কিনা । স্ট্যাকওভারফ্লো . 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>

খণ্ডের অনক্রিটভিউতে ():

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

এবং ভিউপ্যাজার থেকে টুকরোটি ফেরত পাঠানোর পদ্ধতি, যদি বিদ্যমান থাকে:

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);
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.