ফ্রেগমেন্টপাগারএডাপ্টার এবং ফ্র্যাগমেন্টস্টেটপেজার অ্যাডাপ্টারের মধ্যে পার্থক্য কী?


374

মধ্যে পার্থক্য কি FragmentPagerAdapterএবং FragmentStatePagerAdapter?

FragmentPagerAdapterগুগলের গাইড সম্পর্কে বলেছেন:

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

এবং সম্পর্কে FragmentStatePagerAdapter:

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

সুতরাং আমি মাত্র 3 টুকরা আছে। তবে এগুলির সমস্তই আলাদা পরিমাণে ডেটাযুক্ত মডিউল।

Fragment1কিছু ডেটা পরিচালনা করে (যা ব্যবহারকারীরা প্রবেশ করে) এবং ক্রিয়াকলাপের মাধ্যমে এটিকে পাস করে Fragment2, যা কেবল একটি সহজ ListFragmentFragment3এছাড়াও একটি ListFragment

সুতরাং আমার প্রশ্নগুলি : আমার কোন অ্যাডাপ্টার ব্যবহার করা উচিত? FragmentPagerAdapterবা FragmentStatePagerAdapter?


2
আমি মনে করি কেবলমাত্র 3 টি টুকরো থাকার ফলে আপনি ফ্র্যাগমেন্টপেজারএডাপ্টার ব্যবহার করতে পারবেন। এই খণ্ডগুলির জন্য ট্যাবগুলি সম্ভবত সমস্ত একই সাথে দৃশ্যমান হবে।
ইগোরগানাপলস্কি

2
এই পোস্টটি আমার 5-6 ঘন্টা সঞ্চয় করেছে কারণ আমি ভুল ধরণের অ্যাডাপ্টার ব্যবহার করি
ন্যান্টাপপ

1
এই প্রশ্নের উত্তর আরও একটি প্রশ্ন ছোঁড়া stackoverflow.com/questions/9156406/...
পীযূষ Kukadiya

আছে FragmentPagerAdapterএবং FragmentStatePagerAdapterতবে কি FragmentStateAdapter?
the_prole

উত্তর:


291

দস্তাবেজগুলি বলার মতো, এটি সম্পর্কে এইভাবে ভাবুন। আপনি যদি বইয়ের পাঠকের মতো অ্যাপ্লিকেশনটি করতে চান তবে আপনি একবারে সমস্ত টুকরো স্মৃতিতে লোড করতে চাইবেন না। Fragmentsব্যবহারকারী পড়ার সাথে সাথে আপনি লোড এবং ধ্বংস করতে চান । এই ক্ষেত্রে আপনি ব্যবহার করবেন FragmentStatePagerAdapter। যদি আপনি কেবল 3 "ট্যাব" প্রদর্শন করেন যা প্রচুর পরিমাণে ভারী ডেটা (যেমন Bitmaps) ধারণ করে না , তবে FragmentPagerAdapterআপনার পক্ষে এটি উপযুক্ত। এছাড়াও, মনে রাখবেন যে ViewPagerডিফল্টরূপে 3 টি টুকরো স্মৃতিতে লোড হবে। প্রথম যেটি Adapterআপনি উল্লেখ করেছেন Viewএটি হায়ারার্কিটি ধ্বংস করতে পারে এবং প্রয়োজনে এটি পুনরায় লোড করতে পারে , দ্বিতীয়টি Adapterকেবল তখনই রাষ্ট্রের অবস্থা সংরক্ষণ করে Fragmentএবং এটি সম্পূর্ণরূপে ধ্বংস করে দেয়, যদি ব্যবহারকারী সেই পৃষ্ঠায় ফিরে আসে, রাষ্ট্রটি পুনরুদ্ধার করা হয়।


আমার ফ্রেগমেন্ট 1 এবং লিস্টভিউতে একাধিক বাটন এবং পাঠ্য ভিউ রয়েছে যা ফ্রেগমেন্ট 2 এবং ফ্রেগমেন্ট 3-এ আইটেমগুলি গতিশীলভাবে উত্পন্ন করে। আপনি কি ভাবেন যে ফ্রেগমেন্টস্টেটপেজারএডাপ্টার ব্যবহার করা এবং ক্রিয়াকলাপে সমস্ত ডেটা সঞ্চয় করে, এটি বান্ডিলের মাধ্যমে টুকরো টুকরো করে দেওয়া ভাল?
অ্যালেক্সমোটভ

2
ফ্রেগমেন্টস্টেটপেজারএডাপ্টারের পছন্দের সাথে ফ্রেমমেন্টের লেআউটে অ্যালেক্সমোটোভ ভিউগুলির কোনও সম্পর্ক নেই। এখানে প্রশ্নটি হ'ল অংশগুলির পরিমাণ যা পেজ হবে।
ইগোরগানাপলস্কি

1
সুতরাং বেসিকালি FragmentPagerAdapterএটি ব্যবহার করার পক্ষে কিছু নেই ।
টমাসজ মুলারসিজিক

3
@ টমাসজ এর সুবিধা হ'ল খণ্ডগুলির মধ্যে FragmentPagerAdapterস্যুইচিং অনেক দ্রুত হতে পারে, কারণ প্রকৃত Fragmentবস্তুগুলি প্রতিবার পুনর্নির্মাণের প্রয়োজন হয় না। অন্যদিকে, এটি মেমরিতে টুকরো টুকরো ধারণ করে আরও মেমরি ব্যবহার করে।
রিচার্ড লে ম্যাসুরিয়ার

আমার কাছে 3 টি ট্যাব / পৃষ্ঠাগুলি রয়েছে (যা প্রতিটি ওয়েবউইউ দেখায়) তাই ফ্রেগমেন্টপেজারএডাপ্টার ব্যবহার করেছি । যাইহোক, আমি প্রথম পৃষ্ঠাটি থেকে এটিকে সোয়াইপ করার পরে এখনও শেষ পৃষ্ঠাটি পুনরায় চিত্রায়িত হবে। এটি সমাধান করার জন্য, আমি ব্যবহার করেছি viewPager.setOffscreenPageLimit(2)
নিষিদ্ধ-জিওঞ্জিনিয়ারিং

131
  • FragmentPagerAdapterপুরো খণ্ডটিকে স্মৃতিতে সঞ্চয় করে এবং যদি প্রচুর পরিমাণে টুকরো টুকরো ব্যবহৃত হয় তবে একটি মেমরি ওভারহেড বাড়িয়ে তুলতে পারে ViewPager

  • এর ভাইবোন বিপরীতে, FragmentStatePagerAdapterকেবল টুকরাগুলির সেভডইনস্ট্যান্স স্টেট সংরক্ষণ করে এবং মনোযোগ হারিয়ে ফেললে সমস্ত টুকরো টুকরো টুকরো করে দেয়।

  • সুতরাং FragmentStatePagerAdapterযখন আমাদের গতিশীল টুকরোগুলি যেমন উইজেটগুলির সাথে টুকরো টুকরো ব্যবহার করতে হয়, তখন তাদের ব্যবহার করা উচিত savedInstanceState

  • বিপরীতে এর ভাইবাল FragmentPagerAdapterব্যবহার করা উচিত যখন আমাদের পুরো খণ্ডটিকে স্মৃতিতে সঞ্চয় করতে হবে।

  • যখন আমি বলি পুরো খণ্ডটি স্মৃতিতে রাখা হয়েছে এর অর্থ, এর উদাহরণগুলি ধ্বংস হবে না এবং মেমরির ওভারহেড তৈরি করবে। অতএব এটির জন্য FragmentPagerAdapterকেবলমাত্র কম সংখ্যক টুকরোগুলি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে ViewPager

  • এটি আরও ভাল হবে যদি টুকরোগুলি স্থিতিশীল হয়, যেহেতু তাদের প্রচুর পরিমাণে অবজেক্ট থাকবে না যার উদাহরণগুলি সংরক্ষণ করা হবে।

আরও বিশদ হতে,

FragmentStatePagerAdapter:

  • এর সাথে FragmentStatePagerAdapter, আপনার অবিবাহিত খণ্ডটি ধ্বংস হয়ে গেছে A আপনার ক্রিয়াকলাপ থেকে খণ্ডটি সম্পূর্ণরূপে অপসারণ করতে প্রতিশ্রুতিবদ্ধ FragmentManager

  • রাজ্যটি FragmentStatePagerAdapterআসল সত্য থেকে আসে যে এটি আপনার খণ্ডটি ধ্বংস হয়ে Bundleযাওয়ার savedInstanceStateসময় থেকে রক্ষা পাবে back ব্যবহারকারী যখন নেভিগেট করবে, খণ্ডটির স্থিতি ব্যবহার করে নতুন খণ্ডটি পুনরুদ্ধার করা হবে।

FragmentPagerAdapter:

  • তুলনা FragmentPagerAdapterকরে ধরণের কিছুই হয় না hen যখন খণ্ডটির আর প্রয়োজন হয় না। পরিবর্তে লেনদেন FragmentPagerAdapterকল ।detach(Fragment)remove(Fragment)

  • এটি খণ্ডটির দৃষ্টিভঙ্গি ধ্বংস করে তবে খণ্ডটির দৃষ্টান্তটি জীবন্ত অবস্থায় ফেলে দেয়। FragmentManagerসুতরাং FragmentPagerAdapterএর মধ্যে নির্মিত টুকরোগুলি কখনই ধ্বংস হয় না।


2
আপনার 2 টি উত্তর কেন?
জারেড বুরোজ

স্মৃতিতে পুরো টুকরো টুকরো রেখে কী লাভ?
টমাস মুলারসিজিক

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

1
@ জ্যারেড বুড়োস বিকোজে একটি হ'ল উত্তরসেক্সট যা ছোট এবং স্থির উত্তরের জন্য ভাল এবং অন্যটি উত্তর স্টেটটেক্সট যা বড় এবং গতিশীল উত্তরের জন্য
সহজ ফেলো

48

এখানে প্রতিটি খণ্ডের একটি লগ লাইফসাইকেল রয়েছে ViewPagerযেখানে 4 টি খণ্ড এবং andoffscreenPageLimit = 1 (default value)

FragmentStatePagerAdapter

ফ্রেগমেন্ট 1 এ যান (লঞ্চ ক্রিয়াকলাপ)

Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart

ফ্র্যাগমেন্ট 2 এ যান

Fragment3: onCreateView
Fragment3: onStart

ফ্র্যাগমেন্ট 3 এ যান

Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach
Fragment4: onCreateView
Fragment4: onStart

ফ্রেগমেন্ট 4 এ যান

Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy

FragmentPagerAdapter

ফ্রেগমেন্ট 1 এ যান (লঞ্চ ক্রিয়াকলাপ)

Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart

ফ্র্যাগমেন্ট 2 এ যান

Fragment3: onCreateView
Fragment3: onStart

ফ্র্যাগমেন্ট 3 এ যান

Fragment1: onStop
Fragment1: onDestroyView
Fragment4: onCreateView
Fragment4: onStart

ফ্রেগমেন্ট 4 এ যান

Fragment2: onStop
Fragment2: onDestroyView

উপসংহার : FragmentStatePagerAdapterকল onDestroyযখন অসম্পূর্ণ অংশ পরাস্ত হয় offscreenPageLimitযখন FragmentPagerAdapterনা।

নোট : আমি মনে করি আমরা ব্যবহার করা উচিত FragmentStatePagerAdapterএকটি জন্য ViewPagerযা করা হয়েছে কারণ এটি পারফরম্যান্সের জন্য সদিচ্ছা পৃষ্ঠার একটি অনেক আছে।

উদাহরণ কয়েক offscreenPageLimit:

আমরা যদি Fragment3 যান, এটা হবে Fragment1 detroy (অথবা Fragment5 যদি থাকে) কারণ offscreenPageLimit = 1। আমরা সেট offscreenPageLimit > 1করলে তা ধ্বংস হবে না will
এই উদাহরণে যদি আমরা সেট করে থাকি offscreenPageLimit=4, ফ্রেগমেন্ট কখনই কল করে না এবং কখন আমরা ট্যাব পরিবর্তন করি তা ব্যবহার করার মধ্যে FragmentStatePagerAdapterবা এর মধ্যে আলাদা FragmentPagerAdapterনয়onDestroyViewonDestroy

গিথুব ডেমো এখানে


সমাপ্তির এতো দুর্দান্ত উপায়!
রাহুল রাস্তোগি

সুন্দর ব্যাখ্যা
গৌরব সিংহল

1
সুন্দর ব্যাখ্যা। আপনি বলেছিলেন যে প্রচুর পৃষ্ঠাগুলি থাকাকালীন ফ্রেগমেন্টস্টেটপেজারএডাপ্টার ব্যবহার করা পারফরম্যান্সের পক্ষে ভাল। আপনি কি বোঝাতে চেয়েছিলেন যে এটি মেমরি সঞ্চয় করার পক্ষে ভাল? আমি যে লক্ষ্যটি বুঝতে পেরেছি তা হ'ল সম্ভব বহু খণ্ডের দৃষ্টান্তগুলির ক্ষেত্রে স্মৃতি সংরক্ষণ করা - সুতরাং কার্য সম্পাদনই অন্তর্নিহিত সুবিধা; স্পষ্ট লক্ষ্য হ'ল স্মৃতি সংরক্ষণ করা
হাটজিল

38

ডকুমেন্টেশনে বা এই পৃষ্ঠায় উত্তরগুলিতে স্পষ্টভাবে বলা হয়নি এমন কিছু (@ নার্টু দ্বারা বোঝানো হলেও) FragmentPagerAdapterএটি ফ্র্যাগমেন্টগুলিকে আপডেট করবে না যদি খণ্ডের ডেটা পরিবর্তন হয় কারণ এটি খণ্ডকে স্মৃতিতে রাখে।

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

আমার এখানে পুরো বিষয়টি হ'ল যে খণ্ডগুলির সংখ্যা এবং সেগুলি সাদৃশ্যপূর্ণ কিনা তা সর্বদা বিবেচনা করার মূল দিক নয়। আপনার টুকরো গতিশীল কিনা তাও মূল বিষয়।


সুতরাং বলুন যে আমার কাছে টুকরো টুকরো 2 তে 1 টি পুনর্ব্যবহারযোগ্য ভিউ আছে, আমি যখন কোনও আইটেমটিতে ক্লিক করি তখন এটি খণ্ড বি এর সামগ্রী পরিবর্তন করে, বলুন আমি টুকরা.সেট টেক্সট ("ব্লেব্লাবলা") করি। আমার কি রাজ্যের পেজারথ্যান ব্যবহার করা উচিত?
সিড

নিশ্চিত না তবে আমি হ্যাঁ বলব। উভয়ই চেষ্টা করুন, যাইহোক আপনার কোডটিকে অন্যের থেকে পরিবর্তন করা সত্যিই সহজ এবং দ্রুত।
জেডেনাইস

@ জেডেনিস আপনি কি নিশ্চিত যে এটি সঠিক? আমি FragmentPagerAdapterআমার ক্রিয়াকলাপে ব্যবহার করছি যা দুটি খণ্ড দেখানোর জন্য ভিউপ্যাজার ব্যবহার করে - যেখানে প্রতিটি খণ্ডে একটি তালিকা থাকে। আমার প্রথম তালিকার নাম "সমস্ত প্রতিবেদন" এবং দ্বিতীয় তালিকার নাম "প্রিয় রিপোর্ট"। প্রথম তালিকায় আমি যদি কোনও প্রতিবেদনের জন্য তারকা আইকনটি ট্যাপ করি তবে এটি সেই প্রতিবেদনের পছন্দসই স্থিতি টগল করতে ডাটাবেস আপডেট করে। আমি তারপরে সোয়াইপ করেছি এবং আমি দ্বিতীয় প্রতিবেদনের ইউআইতে সফলভাবে এই প্রতিবেদনটি দেখতে পাচ্ছি। সুতরাং সম্ভবত উদাহরণগুলি স্মৃতিতে রাখা হয়েছে তবে কিছু ক্ষেত্রে (যেমন খনি) সামগ্রীটি প্রকৃতপক্ষে ফ্রেগমেন্টপাগারএডাপ্টারের জন্য জরিমানা আপডেট করবে
নিষিদ্ধ-জিওঞ্জিনিয়ারিং

14

FragmentPagerAdapterপূর্ববর্তী ডেটা সংরক্ষণ করে যা অ্যাডাপ্টার থেকে আনা হয় এবং যখন প্রতিটি FragmentStatePagerAdapterসময় এটি কার্যকর করা হয় তখন অ্যাডাপ্টার থেকে নতুন মান নেয় takes


4

ফ্রেগমেন্টস্টেটপেজারএডাপ্টার = ভিউপ্যাজারে বিশাল সংখ্যক টুকরোগুলি সমন্বিত করতে। যেহেতু এই অ্যাডাপ্টারটি খণ্ডটিকে ধ্বংস করে যখন এটি ব্যবহারকারীর কাছে দৃশ্যমান হয় না এবং কেবলমাত্র ব্যবহারের জন্য টুকরোটির সেভডআইনস্ট্যান্স স্টেট রাখা হয়। এইভাবে স্বল্প পরিমাণে মেমরি ব্যবহৃত হয় এবং গতিশীল খণ্ডগুলির ক্ষেত্রে আরও ভাল পারফরম্যান্স সরবরাহ করা হয়।


1

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

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

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