[英]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.