我在MainActivity界面放置了四个fragment,实现的是底部导航栏的功能,一个fragment就是一个界面
第三个fragment上显示了一些数据库内的信息,又放了一个按钮,现在我想点击按钮后修改数据库,同时刷新fragment界面,因为不刷新的话fragment上展示的数据库信息就不对。这该怎么做?修改数据库的代码已经写完了,不知道刷新界面怎么写。
我之前是点击按钮跳转MainActivity,但是这样会自动展示第一个fragment,怎样可以点击后不跳转,只刷新fragment?
MainActivity代码:
public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener, ViewPager.OnPageChangeListener {
ViewPager viewPager;
BottomNavigationView bottomNavigationView;
HomeFragment homeFragment = new HomeFragment();
CommunityFragment communityFragment = new CommunityFragment();
MallFragment mallFragment = new MallFragment();
MineFragment mineFragment = new MineFragment();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();//初始化
}
private void init() {
//获取页面标签对象
viewPager = findViewById(R.id.viewPager);
viewPager.setOnPageChangeListener(this);//添加页面切换监视器
bottomNavigationView = findViewById(R.id.bottomNavigation);
bottomNavigationView.setOnNavigationItemSelectedListener(this);//添加导航栏选择监视器
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {//给页面添加适配器
@NonNull
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:return homeFragment;
case 1:return communityFragment;
case 2:return mallFragment;
case 3:return mineFragment;
}
return null;
}
@Override
public int getCount() {//界面个数
return 4;
}
});
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override
public void onPageSelected(int position) {
bottomNavigationView.getMenu().getItem(position).setChecked(true);
}
@Override
public void onPageScrollStateChanged(int state) { }
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
viewPager.setCurrentItem(item.getOrder());
return true;
}
}
要刷新当前 fragment 界面,可以使用 FragmentTransaction 类中的 replace 方法。当调用 replace 方法时,它会将现有的 fragment 替换为新的 fragment,从而刷新界面。
以下是示例代码:
// 获取当前 fragment 的实例
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
// 创建一个新的 fragment 实例,并传入需要的参数
Fragment newFragment = new MyFragment();
Bundle args = new Bundle();
args.putString("key", "value");
newFragment.setArguments(args);
// 开始 FragmentTransaction
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// 替换当前的 fragment 为新的 fragment
transaction.replace(currentFragment.getId(), newFragment);
// 提交事务
transaction.commit();
在你的按钮点击事件中,调用以上代码,并替换为当前 fragment 实例和新的 fragment 实例。确保新的 fragment 包含了更新后的数据库信息。
另外,如果你只想刷新当前 fragment 的数据,可以在 fragment 中添加一个公共方法,用于更新数据并刷新界面。在按钮点击事件中,直接调用这个方法即可。
这种如果fragment比较多或页面耗时,如果不使用懒加载滑动切换界面会出现卡顿现象,这样fragment会先显示出空页面,侧滑不会卡,然后再慢慢加载出页面内容。这样需要再页面显现出来后做加载内容调接口的操作,再fragment显现回调的方法有两种情况
1.viewpager+fragment
2.show,hide fragment
第一种:
回调的是
setUserVisibleHint(boolean isVisibleToUser)
第二种:
回调的是
onHiddenChanged(boolean hidden)
这里要分别做一下区分,还有一个问题是setUserVisibleHint回调方法再fragment创建时页面还没有加载出来也会回调,所以需要判断fragment是否已经创建完成,还有就是懒加载做一次的操作。当然也会遇到fragment点击显现就想要刷新数据的操作。
在
onActivityCreated中加
activityIsCreated = true;
if (theFragmentIsVisible && !theDelayLoad) { theDelayLoad = true; delayLoad(); }
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
theFragmentIsVisible = true;
if (activityIsCreated && !theDelayLoad) {
theDelayLoad = true;
delayLoad();//懒加载
}else if(activityIsCreated){
onVisibleRefresh();//可见刷新
} else {
theFragmentIsVisible = false;
}
}
希望对大家有帮助
你在当前Fragment中显示数据并放置了一个按钮,那你就在数据更新之后再执行一遍加载数据的方法嘛