ফ্রেগমেন্টপেজারএডাপ্টার getItem বলা হয় না


123

আমি ফ্র্যাগমেন্টপেজারএডাপ্টারে খণ্ডকে পুনরায় ব্যবহার করতে পারছি না .. ডার্সন আইটেম () পদ্ধতিটি ব্যবহার করে, এটি খণ্ডটি মুছে ফেলা হচ্ছে তবে এখনও তাকে getItem () বলা হয় না..এখানে মাত্র ২-৩ টি চিত্র রয়েছে তাই আমি ফ্র্যাগমেন্টস্টেটপেজার অ্যাডাপ্টারটি ফ্রেগমেন্টস্টেটপেজারের পরিবর্তে ব্যবহার করছি ..

public class ExamplePagerAdapter extends FragmentPagerAdapter {

    ArrayList < String > urls;
    int size = 0;
    public ExamplePagerAdapter(FragmentManager fm, ArrayList < String > res) {
        super(fm);
        urls = res;
        size = urls.size();
    }

    @Override
    public int getCount() {
        if (urls == null) {
            return 0;
        } else {
            return size;
        }

    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        FragmentManager manager = ((Fragment) object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment) object);
        trans.commit();
    }

    @Override
    public Fragment getItem(int position) {

        Fragment fragment = new FloorPlanFragment();
        Bundle b = new Bundle();
        b.putInt("p", position);
        b.putString("image", urls.get(position));
        Log.i("image", "" + urls.get(position));
        fragment.setArguments(b);
        return fragment;
    }
}

এবং খন্ডের ক্রিয়াকলাপে,

pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2)); 

3
আপনি ওভাররড করার কোনও বিশেষ কারণ আছে destroyItem()? এটি প্রয়োজন হয় না।
কমন্সওয়্যার

আবার আরম্ভ করার জন্য ফ্রেগমেন্টস্টেটপেজারএডাপ্টার ব্যবহার করুন যখন আপনি এটিকে সুপার.ডেস্ট্রয় আইটেম (কন্টেইনার, অবস্থান, অবজেক্ট) ওভাররাইড করবেন;
ফাযিজি

উত্তর:


306

KISS উত্তর:

ফ্রেগমেন্টপাগারএডাপ্টারের পরিবর্তে সরল ব্যবহার ফ্র্যাগমেন্টস্টেটপাগারএডাপ্টার

আমি উত্তরটি পেয়েছি .. প্রথমত আমি এই প্রশ্নটি মুছে ফেলার কথা ভেবেছিলাম কারণ আমি খুব নিরীহ ভুল করছি তবে এই উত্তরটি এমন কাউকে সহায়তা করবে যা তার পরিবর্তে FragmentPagerAdapterব্যবহারের ক্ষেত্রে একই সমস্যার মুখোমুখি হবে FragmentStatePagerAdapter

যেমনটি ব্ল্যাকহ্যাটসামুরাই মন্তব্যে উল্লেখ করেছেন:

এই কাজ করার কারণটি হ'ল কারণগুলি FragmentStatePagerAdapterব্যবহৃত হচ্ছে না এমন খণ্ডগুলি হিসাবে ধ্বংস করে। FragmentPagerAdapterনা.


অনেক অনেক ধন্যবাদ। আপনার উত্তর আমাকে অনেক সাহায্য করেছে।
প্রিয়া

1
অন্য 'আমাকেও হতে ঘৃণা!' পোস্ট, তবে হ্যাঁ। <প্রশ্ন মুছে ফেলার জন্য ধন্যবাদ।
পল রুইজ

34
এই কাজ করার কারণ হ'ল ফ্রেগমেন্টস্টেটপেজারএডাপ্টারগুলি ব্যবহার করা হচ্ছে না এমন খণ্ডগুলি হিসাবে ধ্বংস করে। ফ্র্যাগমেন্টপেজারএডাপ্টার দেয় না।
ব্ল্যাকহ্যাটসামুরাই

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

2
@ নাজিবপুতোওয়ালা আমি ফ্রেগমেন্টস্টেটপেজারএডাপ্টার ব্যবহার করেছি তবে এখনও একই সমস্যার মুখোমুখি। getItem () বলা হয়নি
sam_k

168

একটি FragmentStatePagerAdapterসম্পূর্ণরূপে আমার সমস্যার সমাধান করেনি যা একই ধরণের সমস্যা যেখানে onCreateViewভিউ পেজারে শিশু খণ্ডের জন্য ডাকা হয়নি। আমি প্রকৃতপক্ষে আমার FragmentPagerAdapterঅন্যটির ভিতরে বাসা বাঁধছিFragment তাই তাদের FragmentManagerসমস্তটি জুড়েই ভাগ করে নেওয়া হয়েছিল এবং এইভাবে পুরানো টুকরো টুকরো টুকরো ধরে রাখছে। ঠিকঠাকটি পরিবর্তে আমার হোস্ট টুকরাটির getChildFragmentManagerকনস্ট্রাক্টরকে একটি উদাহরণ খাওয়ানো হয়েছিল FragmentPagerAdapter। কিছুটা এইরকম...

FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager());

getChildFragmentManager()পদ্ধতি একটি টুকরা মাধ্যমে অ্যাক্সেসযোগ্য এবং কারণ এটি একটি ব্যক্তিগত ফেরৎ এই আমার জন্য কাজ FragmentManagerবিশেষভাবে পরিস্থিতিতে যা পাখির টুকরা প্রয়োজন হয় যে টুকরা জন্য। আমি আশা করি এটি এমন কাউকে সহায়তা করে যাঁর আমারও একই সমস্যা হতে পারে !!

  • মনে রাখবেন তবে getChildFragmentManager()আপনার ন্যূনতম এপিআই সংস্করণটি ব্যবহার করতে হবে ন্যূনতম হতে হবে 17 (4.2), সুতরাং এটি আপনার গিয়ার্সে একটি রেঞ্চ ফেলতে পারে। অবশ্যই, আপনি যদি সমর্থন লাইব্রেরি v4 থেকে টুকরা ব্যবহার করছেন তবে আপনার ঠিক আছে।

25
এটা সঠিক উত্তর. সমস্যাটি হ'ল অন্য টুকরো টুকরো টুকরো টুকরাগুলি getFragmentManager () এর পরিবর্তে getChildrenFraamentManager () ব্যবহার করা উচিত।
শিহপেনগ

আপনাকে অনেক ধন্যবাদ, এই উত্তরটি খুঁজে পেতে আমাকে চিরকাল ধরে নিয়ে গেল!
শপঙ্গোলয়েড

আমি @hihpeng এর সাথে একমত এটি সঠিক উত্তর হওয়া উচিত।
রেমন্ড লুকান্ত

এই আমার জন্য একটি স্থির ছিল। উত্তর জমা দেওয়ার জন্য অনেক ধন্যবাদ
user3734429

দস্তাবেজগুলিকে সত্যই ওয়াক-থ্রু করে ডাকা উচিত। এটি অত্যন্ত বাস্তববাদী যে একটি ভিউপাগার একটি খণ্ডের মধ্যে লোড হবে। এই উত্তর পোস্ট করার জন্য ধন্যবাদ।
কাজ করেছেন

7

অগ্রাহ্য করা long getItemId (int position)

FragmentPagerAdapterএটি ব্যবহার করে তৈরি করা টুকরোগুলি ক্যাশে করে getItem। আমি একই সমস্যার মুখোমুখি হয়েছি- কল করার পরেও ফোন notifyDataSetChanged() getItemকরা হয়নি।

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

long getItemId (int position)

প্রদত্ত অবস্থানে আইটেমটির জন্য একটি অনন্য শনাক্তকারীকে ফিরিয়ে দিন।

ডিফল্ট বাস্তবায়ন প্রদত্ত অবস্থানে ফিরে আসে। আইটেমের অবস্থানগুলি পরিবর্তন করতে পারে যদি সাবক্লাসগুলি এই পদ্ধতিটি ওভাররাইড করে।

প্রতিটি খণ্ডকে কেবল একটি অনন্য আইডি সরবরাহ করুন এবং আপনার কাজ শেষ।

একটি ব্যবহার FragementStatePagerAdapterবা ফিরে POSITION_NONEমধ্যে int getItemPosition (Object object)ভুল। আপনি কোনও ক্যাচিং পাবেন না।


এই এক সঠিক উত্তর ছিল। আমাকে টুকরো টুকরো করার জন্য বিভিন্ন আইডির সরবরাহ করতে হয়েছিল getItemIdএবং যদি খণ্ডটি সরিয়ে ফেলা getItemPositionহয় তবে ফিরিয়ে দিতে সামঞ্জস্য POSITION_NONEকরেছি। তার জন্য আমার একটি এনাম পতাকা রয়েছে। তারপরে getItemডাকা হবে।
মুরাত কারাগেজ

আপনাকে ধন্যবাদ +
মুরতকারাগিজ

5

@ কণিকা এবং @ জ্যাকো ১১ পোস্ট করেছে আমি তা করেছি তবে আমার এখনও সমস্যা ছিল।

সুতরাং, অনেক পরিবর্তনের পরে, আমি এমন একটি পেয়েছি যা আমার পক্ষে কাজ করেছিল এবং পরের কোডটি আমার ফ্রেগমেন্টপেজার অ্যাডাপ্টারে যুক্ত হয়েছিল:

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

আমি কি পড়তে মতে, getItemPosition অবহিত করতে ব্যবহৃত হয় ViewPager হোক বা না হোক একটি আইটেম রিফ্রেশ করতে, এবং যদি প্রোফাইল অবস্থানের সময়ে আইটেম পরিবর্তিত হয়নি আপডেট এড়ানো।


2

দুটি পৃথক পরিস্থিতি রয়েছে: ১) প্রতিটি পেজারের জন্য আপনার একই লেআউট রয়েছে: সেক্ষেত্রে আপনি পেজারআডাপ্টার দ্বারা আপনার কাস্টম অ্যাডাপ্টারটি প্রসারিত করে এবং একটি একক বিন্যাস ফেরত দিলে ভাল হয়।

২) প্রতিটি পেজারের জন্য আপনার আলাদা লেআউট রয়েছে: সেক্ষেত্রে আপনি ফ্র্যাগমেন্টস্টেটপেজারএডাপ্টার দ্বারা আপনার কাস্টম অ্যাডাপ্টারটি প্রসারিত এবং প্রতিটি পেজারের জন্য আলাদা আলাদা টুকরো ফিরে দিলে ভাল হয় better


2

পদ্ধতিটি getItem()কেবলমাত্র নতুন আইটেম তৈরি করতে ব্যবহৃত হয়। একবার তারা তৈরি করার পরে, এই পদ্ধতিটি কল করা হবে না। আপনার যদি অ্যাডাপ্টারের দ্বারা মুদ্রা আইটেমটি ব্যবহারের প্রয়োজন হয় তবে এই পদ্ধতিটি ব্যবহার করুন:

pagerAdapter.instantiateItem(viewPager, TAB_POS)

0

আমি দেখতে পেয়েছি যে ট্যাব-বিন্যাসে শ্রোতা সেট করা এটিকে ডাকানো থেকে বিরত করেছে, সম্ভবত তাদের শ্রোতাদের tabLayout.setOnTabSelectedListenerঅ্যারের পরিবর্তে কেবলমাত্র একজন শ্রোতার পক্ষে স্থান রয়েছে ।

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