【问题标题】:How to refresh or update all fragment from the viewpager android如何从viewpager android刷新或更新所有片段
【发布时间】:2018-10-30 07:17:32
【问题描述】:

我有带有 tablayout 的 viewpager,里面有 3 个片段。在我的片段 2 和 3 中,我滑动以刷新以更新 firebase 数据库中的数据。

我希望它使用工具栏中的 1 个按钮刷新,并刷新其中的所有片段。

还有一个问题是,我必须刷新片段 2 次才能更新 recyclerview ..... 不知道怎么弄,请帮忙

双片段

public static final String TAG = "TWO_FRAGMENT";

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser) {

        } else {
            mAuth = FirebaseAuth.getInstance();
            userRef = FirebaseDatabase.getInstance().getReference("user_course");
            users = FirebaseAuth.getInstance().getCurrentUser();
            daftarTugasRef = FirebaseDatabase.getInstance().getReference("tugas");
            mTugasRef = FirebaseDatabase.getInstance().getReference("tugas_course");
            mFlagTugas = FirebaseDatabase.getInstance().getReference("flag_tugas");

            LoadData();
        }
    }


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    setHasOptionsMenu(true);

    v =  inflater.inflate(R.layout.fragment_two, container, false);

swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {

                    @Override public void run() {
                        LoadData();
                        swipeLayout.setRefreshing(false);
                        listTugas.clear();

                    }
                    private void onLoaded() {
                        swipeLayout.setEnabled(true);
                        swipeLayout.setRefreshing(false);
                    }

                }, 500);
            }
        });

MainActivity

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

       viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setOffscreenPageLimit(3);
        setupViewPager(viewPager);
        viewPager.setCurrentItem(position);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
reloadFragment("TWO_FRAGMENT");

        setupTabIcons();
}

private void setupViewPager(ViewPager viewPager) {
        adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new OneFragment(), "ONE");
        adapter.addFrag(new TwoFragment(), "TWO");
        adapter.addFrag(new ThreeFragment(), "THREE");
        viewPager.setAdapter(adapter);
        viewPager.getAdapter().notifyDataSetChanged();
    }




    class ViewPagerAdapter extends FragmentStatePagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }



        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }




    @Override
    public void onPageSelected(int position) {
//        viewPager.getAdapter().notifyDataSetChanged();

//        adapter.notifyDataSetChanged();
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }

protected void reloadFragment(String TAG){
        // Reload current fragment
        Fragment frg = null;
        frg = this.getSupportFragmentManager().findFragmentByTag(TAG);
        FragmentTransaction ft =this.getSupportFragmentManager().beginTransaction();
        ft.detach(frg);
        ft.attach(frg);
        ft.commit();
    }

【问题讨论】:

标签: android firebase android-fragments android-viewpager android-tablayout


【解决方案1】:

你可以使用EventBus,把它放在你所有的片段中:

 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }


@Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(ViewEvent viewEvent) {
        if (viewEvent.getMessage().equals("updateViews")) {
            updateView();

        }


    }

当你想更新时,你可以发送这样的事件:

 EventBus.getDefault().post(new ViewEvent("updateViews"));

PS:ViewEvent 是一个您必须创建的对象,其中包含要发送给所有订阅片段的内容。

public class ViewEvent {

    private String message;

    public ViewEvent( String message) {

        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

【讨论】:

  • 我应该在 MainActivity 中添加什么?以及如何订阅fragmentsqwer?
  • 第一个代码允许您订阅发送的任何 ViewEvent,因此您的片段必须首先订阅,当您的数据在 MainAct 或片段中更新时,您发送一个类似于第二个代码的事件。
  • 找不到符号getMessage
  • 非常抱歉,先生,您能提供我的代码吗?
  • 所以我想刷新viewpager中的所有片段,我调用了EventBus.getDefault().post(new ViewEvent("updateViews"));在主要活动中?
【解决方案2】:

只需在您的按钮单击上调用以下方法即可刷新片段 -

 protected void reloadFragment(String TAG){
        // Reload current fragment
        Fragment frg = null;
        frg = getActivity().getSupportFragmentManager().findFragmentByTag(TAG);
        FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
        ft.detach(frg);
        ft.attach(frg);
        ft.commit();
    }

通过以下代码行在 Fragment 中声明您的 TAG 变量 -

public static final String TAG = "HOME_FRAGMENT";

每当您在活动中推送片段时,请使用相同的标签 -

getSupportFragmentManager().beginTransaction().setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out).replace(container, fragment, tag).commit();

您只需要为每个 Fragment 设置一个 TAG。希望你能得到使用这个的解决方案。

【讨论】:

  • 如何给片段添加标签?我使用 viewpager 选项卡布局来创建片段
  • 我认为最好在片段中创建一个公共方法并从活动中调用它,而不是分离和附加片段。
  • 我应该将 android:tag="fragmenttwo" 添加到我的父视图片段吗?
  • @AyushKhare 我做到了,而且有效。但问题是,当我关闭并打开应用程序时,它不会更新。我必须关闭打开 2 次,或滑动刷新 2 次。
  • @yehezkielyehezkiel 你不必在这里使用 xml 属性,只需使用上面的代码 sn-p 创建你的片段,这样 TAG 就会出现,它有助于刷新你的片段。请参阅更新的代码以供参考。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多