在我重新启动我的应用程序或切换到我的第三个 TAB 之前,我的 TAB 片段不会刷新
My TAB fragment does not refresh until i restart my application or switch to my 3rd TAB
我的应用程序包含 3 个选项卡,从第一个选项卡开始,我使用一个按钮转到新的 activity。在我的新 activity 上,我将数据保存到 SQLite 数据库。当我 return 返回选项卡时,它不会自动刷新。要将数据放在选项卡上,我必须重新启动应用程序,或者当我移动到第 3 个选项卡时,当我 return 回到第 2 个选项卡时,第 1 个选项卡被销毁并重新创建。
那么如何刷新包含Tab的tab或者Activity。
我的标签代码是:
public class MedListActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.med_list_activity);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar();
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new HomeFragment(), "Home");
adapter.addFragment(new PrescriptionFragment(), "Prescriptions");
adapter.addFragment(new AccountSettingFragment(), "Accounts");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
和我开始新 Activity.
的 Tab 片段
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_home, container, false);
// TextView timeText= (TextView)view.findViewById(R.id.textTime);
// String currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date());
// timeText.setText(currentDateTimeString);
FloatingActionButton addBtn=(FloatingActionButton)view.findViewById(R.id.btnAdd);
addBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent newActivity;
newActivity = new Intent(getActivity(), AddMedication.class);
getActivity().startActivity(newActivity);
}
});
recyclerViewPassed=(RecyclerView)view.findViewById(R.id.PastMedList);
recyclerViewup=(RecyclerView)view.findViewById(R.id.UpMedList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
recyclerViewPassed.setLayoutManager(linearLayoutManager);
LinearLayoutManager linearLayoutManager2 = new LinearLayoutManager(context);
recyclerViewup.setLayoutManager(linearLayoutManager2);
context=getActivity();
databaseAdaptor=new DatabaseAdaptor(context);
Calendar calendar = Calendar.getInstance();
int day = calendar.get(Calendar.DAY_OF_WEEK);
switch (day) {
case Calendar.SUNDAY:
daysName="Sun";
break;
case Calendar.MONDAY:
daysName="Mon";
break;
case Calendar.TUESDAY:
daysName="Tue";
break;
case Calendar.WEDNESDAY:
daysName="Wed";
break;
case Calendar.THURSDAY:
daysName="Thu";
break;
case Calendar.FRIDAY:
daysName="Fri";
break;
case Calendar.SATURDAY:
daysName="Sat";
break;
}
Calendar cal= Calendar.getInstance();
SimpleDateFormat simpleDateFormat= new SimpleDateFormat("hh:mm aa");
initializeData();
initializeAdapterpassed();
initializeAdapterup();
// Inflate the layout for this fragment
return view;
}
private void initializeData() {
databaseAdaptor.checkDaysName(daysName);
}
private void initializeAdapterpassed(){
RVApassedAdapter adapter = new RVApassedAdapter(databaseAdaptor.passedLists);
recyclerViewPassed.setAdapter(adapter);
}
private void initializeAdapterup(){
RvUpAdapter adapter = new RvUpAdapter(databaseAdaptor.upList);
recyclerViewup.setAdapter(adapter);
}
}
如何在将数据保存到数据库后自动刷新选项卡 Activity。
在 MedListActivity 中,添加以下代码:
@Override
public void onResume(){
if(viewPager != null && viewPager.getAdapter() != null) {
viewPager.getAdapter().notifyDataSetChanged();
}
}
它应该刷新选项卡。
如果这不起作用,请执行以下操作:
- 将 Adapter 创建机制(我假设这是您要显示的数据)移动到一个单独的方法,该方法将在 OnCreate 中调用。这不会改变当前行为。
- 在 Fragment 中,覆盖 onResume 方法并调用这个新的适配器创建方法。
总结我们的评论讨论,最终的解决方案是在片段代码中添加以下方法:
@Override
public void onResume() {
super.onResume();
// Here we call the data setup methods again, to reflect
// the changes which took place then the Fragment was paused
initializeData();
initializeAdapterpassed();
initializeAdapterup();
}
我的应用程序包含 3 个选项卡,从第一个选项卡开始,我使用一个按钮转到新的 activity。在我的新 activity 上,我将数据保存到 SQLite 数据库。当我 return 返回选项卡时,它不会自动刷新。要将数据放在选项卡上,我必须重新启动应用程序,或者当我移动到第 3 个选项卡时,当我 return 回到第 2 个选项卡时,第 1 个选项卡被销毁并重新创建。 那么如何刷新包含Tab的tab或者Activity。 我的标签代码是:
public class MedListActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.med_list_activity);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar();
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new HomeFragment(), "Home");
adapter.addFragment(new PrescriptionFragment(), "Prescriptions");
adapter.addFragment(new AccountSettingFragment(), "Accounts");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
和我开始新 Activity.
的 Tab 片段 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_home, container, false);
// TextView timeText= (TextView)view.findViewById(R.id.textTime);
// String currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date());
// timeText.setText(currentDateTimeString);
FloatingActionButton addBtn=(FloatingActionButton)view.findViewById(R.id.btnAdd);
addBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent newActivity;
newActivity = new Intent(getActivity(), AddMedication.class);
getActivity().startActivity(newActivity);
}
});
recyclerViewPassed=(RecyclerView)view.findViewById(R.id.PastMedList);
recyclerViewup=(RecyclerView)view.findViewById(R.id.UpMedList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
recyclerViewPassed.setLayoutManager(linearLayoutManager);
LinearLayoutManager linearLayoutManager2 = new LinearLayoutManager(context);
recyclerViewup.setLayoutManager(linearLayoutManager2);
context=getActivity();
databaseAdaptor=new DatabaseAdaptor(context);
Calendar calendar = Calendar.getInstance();
int day = calendar.get(Calendar.DAY_OF_WEEK);
switch (day) {
case Calendar.SUNDAY:
daysName="Sun";
break;
case Calendar.MONDAY:
daysName="Mon";
break;
case Calendar.TUESDAY:
daysName="Tue";
break;
case Calendar.WEDNESDAY:
daysName="Wed";
break;
case Calendar.THURSDAY:
daysName="Thu";
break;
case Calendar.FRIDAY:
daysName="Fri";
break;
case Calendar.SATURDAY:
daysName="Sat";
break;
}
Calendar cal= Calendar.getInstance();
SimpleDateFormat simpleDateFormat= new SimpleDateFormat("hh:mm aa");
initializeData();
initializeAdapterpassed();
initializeAdapterup();
// Inflate the layout for this fragment
return view;
}
private void initializeData() {
databaseAdaptor.checkDaysName(daysName);
}
private void initializeAdapterpassed(){
RVApassedAdapter adapter = new RVApassedAdapter(databaseAdaptor.passedLists);
recyclerViewPassed.setAdapter(adapter);
}
private void initializeAdapterup(){
RvUpAdapter adapter = new RvUpAdapter(databaseAdaptor.upList);
recyclerViewup.setAdapter(adapter);
}
}
如何在将数据保存到数据库后自动刷新选项卡 Activity。
在 MedListActivity 中,添加以下代码:
@Override
public void onResume(){
if(viewPager != null && viewPager.getAdapter() != null) {
viewPager.getAdapter().notifyDataSetChanged();
}
}
它应该刷新选项卡。
如果这不起作用,请执行以下操作:
- 将 Adapter 创建机制(我假设这是您要显示的数据)移动到一个单独的方法,该方法将在 OnCreate 中调用。这不会改变当前行为。
- 在 Fragment 中,覆盖 onResume 方法并调用这个新的适配器创建方法。
总结我们的评论讨论,最终的解决方案是在片段代码中添加以下方法:
@Override
public void onResume() {
super.onResume();
// Here we call the data setup methods again, to reflect
// the changes which took place then the Fragment was paused
initializeData();
initializeAdapterpassed();
initializeAdapterup();
}