ভিউপোজার 2 / ভিউমোডেল স্থিতিতে ট্যাব সমস্যা


9

আমি এমভিভিএম প্যাটার্নটি অনুসরণ করছি - যার অর্থ প্রতিটি খণ্ডের জন্য আমার কাছে একটি ভিডমডেল রয়েছে।

আমি ভিউপ্যাজার 2 ব্যবহার করে দুটি ট্যাব যুক্ত করেছি ।

আমার অ্যাডাপ্টারটি দেখতে এমন দেখাচ্ছে:

@Override
public Fragment createFragment(int position) {
    switch (position) {
        case 0:
            return new MergedItemsFragment();
        case 1:     
            return new ValidatedMergedItemsFragment();
    }
    return new MergedItemsFragment();
}

ট্যাবগুলি কাজ করছে। তবে, আমি লক্ষ্য করেছি যে আমার মার্জডআইটেমফ্র্যাগমেন্টের ভিউমোডেলটি অদ্ভুত আচরণ করছে ving আমি ট্যাবগুলি যুক্ত করার আগে আমি এই জাতীয় খণ্ডটিতে নেভিগেট করেছি:

NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment);

যখন আমি সেই খণ্ডটি ছেড়ে দিয়েছিলাম NavHostFragment.findNavController(this).popBackStack()এবং পরে সেই টুকরোটিতে ফিরে এসে আমি একটি নতুন খালি ভিউমোডেল পেয়ে যাব। এই উদ্দেশ্য ছিল।

নতুন পদ্ধতির সাথে আমি নেভিগেট করছি return new MergedItemsFragment()। আমি যখন এই টুকরোটি ছেড়ে দিই এবং পরে ফিরতি সময়ে আমি একটি ভিউমোডেল পাচ্ছি যাতে পুরানো ডেটা রয়েছে । এটি একটি সমস্যা কারণ পুরানো ডেটা আর প্রাসঙ্গিক নয় কারণ ব্যবহারকারী অন্য খণ্ডে বিভিন্ন ডেটা নির্বাচন করেছেন।


আপডেট # 1

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


আপডেট # 2

আমি আমার ভিউমোডেলগুলি এটির মতো সেট করেছি:

viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class)

আমি একই ফলাফল পেতে:

viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class);

আমি খণ্ডের মধ্যে ভিউমোডেলকে আবদ্ধ করি। সুতরাং, thisখণ্ডটি হয়।


আপনি কীভাবে আপনার ভিউমোডেলগুলি সেট করছেন তা দেখাতে পারেন? এছাড়াও, নতুন ডেটা পেলে আপনি কেবল নতুন ভিউমোডেল তৈরি করতে পারবেন না এমন কোনও কারণ আছে?
ব্ল্যাকহ্যাটসামুরাই

আমি আমার প্রশ্ন আপডেট করেছি। একটি ভিউ মডেলটির বিন্দুটি কি এটি নিজের যত্ন নেয় না? আমি এটি একবার তৈরি করেছি এবং এটি এক টুকরা অবধি স্থায়ী। আমার কাছে নতুন ডেটা থাকলে আমি ঠিক কীভাবে এটি পুনরায় তৈরি করব এবং কেন আগে আমার এটি করার দরকার হয়নি?
ব্যবহারকারী 123456789

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

আমার সমস্যাটি হ'ল পুরানো ভিএমগুলি আসলে এখনও পুরানো লাইভ ডেটা পরিবেশন করছে এবং অন্যান্য উপাদানগুলিকে পুরানো ডেটা খাচ্ছে feeding সুতরাং ডেটা সাফ করা কোনও কাজ করবে না কারণ পুরানো ভিএমরা হস্তক্ষেপ চালিয়ে যাচ্ছে। উদাহরণ: আমি বর্তমান ভিউমডেলে একটি তালিকা সাফ করি। তবে পর্দাটি এখনও পুরানো তালিকা পায়। আমি যখন ভিউমোডেলটি ডিবাগ করি এবং তালিকাটির দৈর্ঘ্যটি 0 বলায় তবে এটি পরিষ্কার হয়ে যায়। একমাত্র যৌক্তিক ব্যাখ্যা হ'ল পুরানো ডেটা পরিবেশন করা অন্যান্য ভিউমোডেল।
ব্যবহারকারী 123456789

আপনি কি প্রতিটি টুকরা জন্য একই ভিএম ব্যবহার করছেন? অথবা প্রতিটি খণ্ডের নিজস্ব ভিএম আছে?
ব্ল্যাকহ্যাটসামুরাই

উত্তর:


3

আপনার মন্তব্য অনুসারে, আপনি খণ্ডটি ব্যবহার করছেন এবং সেই খণ্ডটির ভিতরে আপনার ভিউপেজার রয়েছে। সুতরাং ভিউপ্যাজারের জন্য আপনার অ্যাডাপ্টার তৈরি করার সময় আপনাকে getActivity () এর পরিবর্তে চাইল্ডফ্রেগমেন্টম্যানেজারটি পাস করতে হবে

নীচে আপনার ভিউপিজারের জন্য একটি নমুনা অ্যাডাপ্টার রয়েছে যা আপনি ব্যবহার করতে পারেন

class NewViewPagerAdapter(fm: FragmentManager, behavior: Int) : FragmentStatePagerAdapter(fm, behavior) {
    private val mFragmentList: MutableList<Fragment> = ArrayList()
    private val mFragmentTitleList: MutableList<String> = ArrayList()

    override fun getItem(position: Int): Fragment {
        return mFragmentList[position]
    }

    override fun getCount(): Int {
        return mFragmentList.size
    }

    fun addFragment(fragment: Fragment, title: String) {
        mFragmentList.add(fragment)
        mFragmentTitleList.add(title)
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return mFragmentTitleList[position]
    }
}

এবং আপনার অ্যাডাপ্টার তৈরি করার সময় এটি কল করুন

   val adapter = NewViewPagerAdapter(
        childFragmentManager,
        FragmentPagerAdapter.POSITION_UNCHANGED
    )

যেন তোমার জন্য ডকুমেন্টেশান দেখুন FragmentStatePagerAdapter এটা বলে যে, আপনি পাস করা উচিত (FragmentManager, int-) আপনার অ্যাডাপ্টারের এর কন্সট্রাকটর ভিতরে

আমি আশা করি এটি একদিন একই সমস্যার মুখোমুখি হওয়ায় এটি আপনার সমস্যাটি সমাধান করবে।

শুভ কোডিং।


1
ধন্যবাদ। যেমন ইয়ানহানিবল্লেকে ইতিমধ্যে বলেছে, খণ্ডটি নিজেই পাস করা যথেষ্ট, কেবল আপনার উপযুক্ত প্রশিক্ষক রয়েছে তা নিশ্চিত করুন। সুতরাং উভয় anwers সঠিক।
ব্যবহারকারী 123456789
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.