【问题标题】:Refresh fragment from tab layout on click单击时从选项卡布局刷新片段
【发布时间】:2019-06-25 11:15:44
【问题描述】:

我有一个带有 2 个片段的选项卡布局,我有一个工具栏,其中包含不同的选项,这些选项属于托管视图寻呼机的活动。

当我单击工具栏选项时,它会清除片段中使用的数据库中的数据,然后它应该刷新它以在屏幕上应用更改。

但我找不到从活动中刷新片段的方法。

这里是片段适配器:

 public class FragmentAdapter extends FragmentPagerAdapter


{

    private final List<Fragment>  lstFragment = new ArrayList<>();
    private final List<String> lstTitles = new ArrayList<>();

    public FragmentAdapter(FragmentManager fm) {
        super(fm);
    }


    @Override
    public Fragment getItem(int i) {
        return lstFragment.get(i);
    }

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

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


    public void AddFragment (Fragment fragment , String title)
    {
        lstFragment.add(fragment);
        lstTitles.add(title);
    }

}

这是我在 main 的片段中调用它的方式:

      FragAdapter = new FragmentAdapter(getSupportFragmentManager());

    ((FragmentAdapter) FragAdapter).AddFragment(new FragmentProgramme(),"Programmes");
    ((FragmentAdapter) FragAdapter).AddFragment(new FragmentPlanning(),"Agenda"); //FRAGMENT I WANT TO REFRESH

    mviewpager.setAdapter(FragAdapter);
    mtablayout = (TabLayout) findViewById(R.id.main_tabs);
    mtablayout.setupWithViewPager(mviewpager);

主要是,我在工具栏上有选项,我想做这样的事情:

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int pos = item.getItemId();
        switch (pos)
        {       
                DatabaseAgenda.getInstance(this).dropDB(); //CLEAN DB
                // I would like to find a function like this : ((FragmentAdapter) FragAdapter).refresh(FragmentPlanning, "Agenda");

                break;
        }

        return super.onOptionsItemSelected(item);
    }

关键是简单地销毁片段,因为必须从屏幕上清除所有数据,然后重新创建它,以便用户可以向其中添加新数据

我希望这很清楚,谢谢你的帮助

我找到了很多答案,但从未找到我真正想要的答案

【问题讨论】:

  • 从数据库中删除数据后,调用 notifydatasetchanged 或再次为 viewpager 设置适配器。
  • 我这样做了:DatabaseAgenda.getInstance(this).dropDB(); mviewpager.setAdapter(FragAdapter); mtablayout.setupWithViewPager(mviewpager); mtablayout.getTabAt(1).select();谢谢

标签: android android-fragments android-tablayout


【解决方案1】:

您可以覆盖片段内部的方法 setUserVisibleHint 以检测它何时可见。可以在此方法内刷新数据。以编程方式选择 pageradapter 的项目会触发当前片段的 setUserVisibleHint。您不需要每次都销毁碎片。

【讨论】:

  • 我在片段方法中创建了 setUserVisibleHint 并调用了刷新方法,但是我如何选择项目?
  • 我的意思是如果我想清理数据时已经在片段中,它不会调用setUserVisibleHint
  • 还有一种方法,但是有点脏。您必须在父活动/片段中保留两个片段的引用。然后在有刷新数据代码的片段中调用公共方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多