簡體   English   中英

片段刷新?

[英]fragment refresh?

我的應用程序由帶有兩個片段的主要活動組成,我使用帶有選項卡的FragmentStatePagerAdapter,我想要的是每次單擊第一個片段的選項卡或滑動到它時刷新第一個片段,我嘗試了很多解決方案,但沒有一個接縫可以正常工作,即時通訊使用onStart和setUserVisibleHint,因此如果它們都為true,則應該刷新該片段,但是我得到的內容是相同的。

我的代碼如下

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();

    }
}

您的代碼是正確的。 為了在用戶看到片段時刷新它,可以使用:

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

在您的代碼中,似乎從未將isStarted標志設置為true,因此您將自己開槍了;)

如果您想知道相同片段的位置來更改其內容,請將偵聽器添加到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) {

      }
    });

還要在tabReselected(Tab tab)方法上調用int雖然您總是只想更新第一個片段,但最好還是保留對其的外部引用。 通常,我建議使用map以位置為鍵保留對所有片段的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM