简体   繁体   English

片段刷新?

[英]fragment refresh?

my app consist of main activity with tow fragments and I,m using FragmentStatePagerAdapter with tabs, what I want is to refresh the first fragment every time I click the first fragment's tab or slide to it, I've tried many solutions but non of them seams to work, Im using onStart and setUserVisibleHint so if they both are true the fragment should be refreshed but I'm getting the same content. 我的应用程序由带有两个片段的主要活动组成,我使用带有选项卡的FragmentStatePagerAdapter,我想要的是每次单击第一个片段的选项卡或滑动到它时刷新第一个片段,我尝试了很多解决方案,但没有一个接缝可以正常工作,即时通讯使用onStart和setUserVisibleHint,因此如果它们都为true,则应该刷新该片段,但是我得到的内容是相同的。

my code is below 我的代码如下

public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;
    CustomAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportActionBar().setElevation(0f);


        viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new CustomAdapter(getSupportFragmentManager(), getApplicationContext()));

        tabLayout = (TabLayout) findViewById(R.id.tab);
        tabLayout.setupWithViewPager(viewPager);

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());

            }
        });


        }
    }




    class CustomAdapter extends FragmentStatePagerAdapter {

        private String[] fragments  = {"Fragment1","Fragment2"};


        public CustomAdapter(FragmentManager supportFragmentManager, Context applicationContext) {
            super(supportFragmentManager);
        }


        @Override
        public Fragment getItem(int position) {
            switch (position){
                case 0:
                    return new Fragment1();
                case 1:
                    return new Fragment2();
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return fragments.length;
        }
        @Override
        public CharSequence getPageTitle(int position){

            return fragments[position];
        }

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


public class Fragment1 extends Fragment {


    private Boolean isVisible = false;
    private Boolean isStarted = false;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

  // Fragments code 

        return rootView;
    }



    @Override
    public void onResume() {
        super.onResume();

    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isVisible = isVisibleToUser;
        if (isVisible && isStarted) {
            refrehList();
            Log.i("Tag", "reloading fragment");
        }

    }

    @Override
    public void onStart() {
        super.onStart();
        isStarted = true;

    }
    @Override
    public void onStop() {
        super.onStop();
        isStarted = false;
    }

    public void refrehList() {
        android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.detach(this).attach(this).commit();

    }
}

Your code is correct. 您的代码是正确的。 In order to refresh the fragment when it becomes visible to the user, you use: 为了在用户看到片段时刷新它,可以使用:

  @Override
    public void setUserVisibleHint(boolean visible) {
        super.setUserVisibleHint(visible);
        if (visible) {
            Log.i("Tag", "reloading fragment");
        }
    }

In your code, it seems that you never set the isStarted flag to true and so you shoot yourself in the leg ;) 在您的代码中,似乎从未将isStarted标志设置为true,因此您将自己开枪了;)

If you want to change content of same fragment knowing its position add listener to viewpager 如果您想知道相同片段的位置来更改其内容,请将侦听器添加到viewpager

Handler handler =new Handler();
viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
      @Override
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

      }

  @Override public void onPageSelected(int position) {
    if(position==0)
      //handler to ensure that method is called after frament creation (rare bag with state restoration)
      handler.post(new Runnable() {
        @Override public void run() {
          if(yourFragment!=null)
            yourFragment.refreshMethod();

        }
      });
  }

      @Override public void onPageScrollStateChanged(int state) {

      }
    });

Also call int on your tabReselected(Tab tab) method While you always want to update only first fragment it is wise to keep external reference to it. 还要在tabReselected(Tab tab)方法上调用int虽然您总是只想更新第一个片段,但最好还是保留对其的外部引用。 Generally i recommend to use map to keep references to all fragments with position as a key. 通常,我建议使用map以位置为键保留对所有片段的引用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM