পুনরায় লোড এ ফ্র্যাগমেন্ট রিফ্রেশ


110

একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে আমি একটি ডিবি থেকে একটি TableViewঅভ্যন্তরে ডেটা লোড করছি Fragment। তবে আমি যখন পুনরায় লোড করব তখন Fragmentএটি পূর্ববর্তী ডেটা প্রদর্শন করে। আমি কি Fragmentপূর্ববর্তী তথ্যের পরিবর্তে বর্তমান তথ্য দিয়ে পুনরায় তৈরি করতে পারি ?


আমাদের কিছু কোড প্রদর্শন করুন। আপনি কোথায় আপনার ডেটা লোড করবেন, কোথায় আপনি আপনার খণ্ডটি শুরু করবেন, কোথায় আপনি আপনার মূল্যবোধগুলি সঞ্চয় করবেন?
AS

: এটি আপনার porly বর্ণনা সমস্যা সমাধানের উচিত stackoverflow.com/questions/6503189/...
বেঞ্জামিন ডব্লিউ

দয়া করে আরও তথ্য-কোড স্নিপেট সরবরাহ করুন
নিকভগুলি

আপনার অ্যাপ্লিকেশনটিতে সোয়াইপ-টু- রিফ্রেশটি
ইমতিয়াজ মামুন

উত্তর:


207

আমি মনে করি আপনি ডিবি আপডেটের পরে খণ্ডের বিষয়বস্তুগুলি রিফ্রেশ করতে চান

যদি তা হয় তবে খণ্ডটি আলাদা করুন এবং এটি পুনরায় সংযুক্ত করুন

// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();

আপনার_সামগ্রী_ট্যাগটি আপনার নাম তৈরি করার সময় আপনি সেই নামটি দিয়েছিলেন

এই কোডটি সমর্থন লাইব্রেরির জন্য।

আপনি পুরনো ডিভাইস সমর্থন না করেন তাহলে, শুধু ব্যবহার getFragmentManager পরিবর্তে getSupportFragmentManager

[Edit]

এই পদ্ধতির জন্য ফ্রেগমেন্টের একটি ট্যাগ থাকা দরকার।
যদি আপনার কাছে এটি না থাকে তবে @ হ্যামার এর পদ্ধতিটি আপনার যা প্রয়োজন।


3
এটি নিম্নলিখিত ত্রুটি দেয় - জাভা.লং.রুনটাইম এক্সসেপশন: ফলাফল প্রদানের ব্যর্থতা ফলাফল রেজাল্ট ইনফো {কে = নাল, অনুরোধ = 2, ফলাফল = 3, তথ্য = নাল activity ক্রিয়াকলাপে ont xont.virtusel.v4.controller / xont.virtusel.v4.controller .sale.InvocieBrandActivity j: java.lang.IllegalStateException: onSaveInstanceState এর পরে এই ক্রিয়াটি সম্পাদন করতে পারবেন না
সামান্থা

1
@ এলিজাবেথ আপনার ফ্রেগমেন্টটি সঠিকভাবে সেট করেছে তা নিশ্চিত করুন
ফ্যান্টাম্যাক্সএক্সএক্স

1
@ রোটওয়াং আপনার জবাবের জন্য ধন্যবাদ আমি লম্বা কোডটি না দিয়ে কেবল একটি শর্টকাট নিয়েছি তবে এটি পথ প্রশস্ত করতে সহায়তা করেছে :)
সি 8

1
এই দ্রষ্টব্যটি সমর্থন-ভি 4-লাইব্রেরির (25.1.0) নতুন সংস্করণে আর কাজ করছে না। এখানে ব্যাখ্যা: stackoverflow.com/questions/41270858/...
ব্রাহিম Bouaboud

1
সতর্কতা: এই কৌশলটি কেবলমাত্র যদি আপনি সমর্থন খণ্ডগুলি ব্যবহার করেন তবে ওরিওতে কাজ করে!
racks

146

এটি বর্তমান খণ্ডকে রিফ্রেশ করবে:

FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
   ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();

1
এই কোডটি কোথায় রাখবেন? ভিতরে ক্রিয়াকলাপ বা খণ্ড খণ্ডন?
নরেন্দ্র সিং

2
আপনি এটি খণ্ডের ভিতরে রেখেছেন যা রিফ্রেশ করা দরকার।
এমবেংগ আসনে

1
@ সাগরচাওয়াদা আপনি কোডটি কোথায় রেখেছেন? আপনাকে ডেটা রিফ্রেশ করার মতো এক সময়ের ইভেন্টে রাখতে হবে।
এমবেংগ আসনে

5
পুনরাবৃত্তি, পুনরাবৃত্তি, অন্তহীন কল
zulkarnain shah

2
এটি খণ্ডে অনারিউমের মধ্যে তৈরি করে একটি লুপ তৈরি করে, কীভাবে এড়ানো যায়?
আত্মা

32

আপনার যদি খণ্ডিত ট্যাগ না থাকে তবে নিম্নলিখিত কোডটি আমার পক্ষে ভাল কাজ করে।

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
 FragmentTransaction fragTransaction =   (getActivity()).getFragmentManager().beginTransaction();
 fragTransaction.detach(currentFragment);
 fragTransaction.attach(currentFragment);
 fragTransaction.commit();}
}

1
খণ্ড আইডির কী হবে, আমি কোথাও টুকরো টুকরো আইডি ঘোষণা করিনি। কীভাবে এবং কোথায় এটি ঘোষণা করবেন?
নরেন্দ্র সিং

getActivity()আমার ক্রিয়াকলাপে ব্যবহার করা যাবে বলে মনে হচ্ছে না । আমার ব্যবহার করা উচিত Activity.this...?
Si8

@ নরেন্দ্রজি এটি ফ্রেম-লেআউট আইডি কেবলমাত্র যেখানে আপনি নিজের টুকরোটি ধারক স্থানে রাখেন।
লোকেশ

দয়া করে অতিরিক্ত ব্রেসটি সরান। এটি আমার জন্য অনেক ঝামেলা করেছিল।
অভিষেক

9

আপনি যখন আপনার খণ্ডটি ব্যবহারকারীর কাছে দৃশ্যমান হবে তা রিফ্রেশ করতে পারেন, কেবলমাত্র এই কোডটি আপনার খণ্ডে যুক্ত করুন এটি আপনার খণ্ডটি দৃশ্যমান হলে তা রিফ্রেশ করবে।

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // Refresh your fragment here          
  getFragmentManager().beginTransaction().detach(this).attach(this).commit();
        Log.i("IsRefresh", "Yes");
    }
}

এটি পুনরায় লোড হওয়া
অবধি

এই viewpager অ্যাডাপ্টারের সাথে ভাল কাজ বলে মনে হয়
DragonFire

2
setUserVisibleHint হ্রাস করা হয়েছে
আদিত্য

আমার জন্য কাজ করেছেন, সমাধানের জন্য ধন্যবাদ।
হেটসগান্ধি

7

খণ্ডটি রিফ্রেশ করার জন্য গৃহীত উত্তরটি নওগাত এবং উপরের সংস্করণে কাজ করবে না। এটি সমস্ত ওএসে কাজ করার জন্য আপনি নিম্নলিখিতগুলি করতে পারেন।

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        fragmentManager.beginTransaction().detach(this).commitNow();
        fragmentManager.beginTransaction().attach(this).commitNow();
    } else {
        fragmentManager.beginTransaction().detach(this).attach(this).commit();
    }

5

ক্রিয়াকলাপের সাথে সংযুক্ত থাকাকালীন আপনি খণ্ডটি পুনরায় লোড করতে পারবেন না, যেখানে আপনি Fragment Already Addedব্যতিক্রম পাবেন।

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

getFragmentManager().beginTransaction().detach(this).attach(this).commit();

আপডেট: এটি এপিআই 26 এবং এর উপরের পরিবর্তনগুলিকে অন্তর্ভুক্ত করতে হবে:

FragmentTransaction transaction = mActivity.getFragmentManager()
                        .beginTransaction();
                if (Build.VERSION.SDK_INT >= 26) {
                    transaction.setReorderingAllowed(false);
                }
                transaction.detach(this).attach
                        (this).commit();

আপডেটের আরও বিবরণের জন্য দয়া করে https://stackoverflow.com/a/51327440/4514796 দেখুন


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

3
   MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
        getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();

আপনি যদি FragmentManagerখণ্ডটি আরম্ভ করতে ব্যবহার করেন তবে এটি কাজ করবে । আপনার যদি এটি <fragment ... />এক্সএমএল হিসাবে থাকে তবে এটি আর কল করবে না onCreateView। এটি বের করার জন্য আমার 30 মিনিটের অপচয় হয়েছে।


1

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

   override fun setUserVisibleHint(isVisibleToUser: Boolean) {
    super.setUserVisibleHint(isVisibleToUser)
    val context = requireActivity()
    if (auth.currentUser != null) {
        if (isVisibleToUser){
            context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()
        }
    }

}

0

ContentProviderএকটি 'কার্সরলডার' ব্যবহার করে আপনার ডেটা লোড করুন । এই স্থাপত্যের সাহায্যে আপনার ডেটা ডাটাবেস পরিবর্তনে স্বয়ংক্রিয়ভাবে পুনরায় লোড হবে। আপনার জন্য তৃতীয় পক্ষের ফ্রেমওয়ার্কগুলি ব্যবহার করুন ContentProvider- আপনি নিজের দ্বারা এটি বাস্তবায়িত করতে চান না ...


0

আমার একই সমস্যা ছিল তবে উপরেরগুলির কোনওটিই আমার পক্ষে কাজ করেনি। হয় একটি ব্যাকস্ট্যাক সমস্যা ছিল (লোড করার পরে যখন ব্যবহারকারী পিছনে চাপলে এটি আবার একই টুকরাটি আবার যেতে পারে) বা এটি কল করতে পারেনিonCreaetView

অবশেষে আমি এটি করেছি:

public void transactFragment(Fragment fragment, boolean reload) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    if (reload) {
        getSupportFragmentManager().popBackStack();
    }
    transaction.replace(R.id.main_activity_frame_layout, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

ভাল পয়েন্ট আপনি খণ্ডের ট্যাগ বা আইডি প্রয়োজন হয় না। আপনি যদি পুনরায় লোড করতে চান



0
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();

GeneralInfo এটা আমার টুকরা ক্লাস GeneralInfo.java

আমি এটি খণ্ড শ্রেণিতে একটি পদ্ধতি হিসাবে রেখেছি:

public void Reload(){
    getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}

0

উদাহরণস্বরূপ TabLayout সহ: কেবলমাত্র অনট্যাবসিলেক্টডলাইজনার প্রয়োগ করুন। পৃষ্ঠাটি পুনরায় লোড করার জন্য, আপনি সোয়াইপ রিফ্রেশলয়আউট প্রয়োগ করতে পারেন nঅনরেফ্রেশলিস্টের অর্থাত্‍public class YourFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

অনারফ্রেশ () পদ্ধতিটি ইন্টারফেস থেকে @ ওভাররাইড হবে অর্থাৎ:

@Override
public void onRefresh() {
 loadData();
}

এখানে লেআউটটি রয়েছে:

<com.google.android.material.tabs.TabLayout
    android:id="@+id/tablayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimaryLighter"
    app:tabGravity="fill"
    app:tabIndicatorColor="@color/white"
    app:tabMode="fixed"
    app:tabSelectedTextColor="@color/colorTextPrimary"
    app:tabTextColor="@color/colorTextDisable" />

আপনার ক্রিয়াকলাপে কোড

#Layout #Layout = (TabLayout) FindViewById (R.id.tablayout); tabLayout.setupWithViewPager (viewPager);

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            if (tab.getPosition() == 0) {
                yourFragment1.onRefresh();
            } else if (tab.getPosition() == 1) {
                yourFragment2.onRefresh();
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

-2
protected void onResume() {
        super.onResume();
        viewPagerAdapter.notifyDataSetChanged();
    }

ভিউপাগারএডাপ্টার লিখুন.নোটাইফ ডেটাসেট চেঞ্জড (); মেইনঅ্যাক্টিভিটিতে অন-রিসুমে ()। শুভকামনা :)


-2

সহজ রাস্তা

ভিউপেজ.সেটএডাপ্টারযুক্ত একটি সর্বজনীন স্ট্যাটিক পদ্ধতি তৈরি করুন

অ্যাডাপ্টার এবং ভিউপেজার স্থির করুন

public static void refreshFragments(){
        viewPager.setAdapter(adapter);
    }

যে কোনও জায়গায়, যে কোনও কার্যকলাপ, যে কোনও খণ্ডকে কল করুন।

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