У меня есть активность с 2 кнопками (btnNext и btnBefore) и макет вкладки с 2 фрагментами. Я хочу обновить sh фрагмент onButtonClickListener без необходимости повторного sh всего макета вкладки, поскольку он каждый раз медленно загружается.
В следующем коде я пытаюсь обновить sh MealPlannerFragment при нажатии btnNext или btnBefore. MealPlannerFragment принимает значение weekNumber в качестве параметра. btnNext добавляет 1 к weekNumber, и фрагмент должен быть обновлен в соответствии с новым weekNumber. Здесь я обновляю весь адаптер, и новый адаптер создается при каждом нажатии, что делает загрузку очень медленной. Я хочу обновить сам фрагмент вместо адаптера, чтобы загрузка стала быстрее.
Обратите внимание, что notifyDataSetChanged () не работает в моем случае.
MealPlanner Activity:
public class MealPlannerActivity extends AppCompatActivity {
TabLayout tabLayout;
ViewPager viewPager;
Toolbar toolbarTop;
TextView mTitle, weekNumberTitle;
ImageButton btnNext, btnBefore;
int weekNumber;
MealPlannerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.meal_planner_activity);
toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);
weekNumberTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title_number);
btnNext = (ImageButton) toolbarTop.findViewById(R.id.btnNext);
btnBefore = (ImageButton) toolbarTop.findViewById(R.id.btnBefore);
weekNumber = Integer.parseInt(weekNumberTitle.getText().toString());
setSupportActionBar(toolbarTop);
getSupportActionBar().setDisplayShowTitleEnabled(false);
tabLayout = findViewById(R.id.tabLayout);
viewPager = findViewById(R.id.viewPager);
tabLayout.addTab(tabLayout.newTab().setText("مخطط الوجبات"));
tabLayout.addTab(tabLayout.newTab().setText("الوصفات"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
launchAdapter();
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
weekNumber = weekNumber + 1 ;
weekNumberTitle.setText(String.valueOf(weekNumber));
Log.v("Week_Number_mpac", String.valueOf(weekNumber));
launchAdapter();
}
});
btnBefore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(weekNumber > 1){
weekNumber = weekNumber - 1 ;
weekNumberTitle.setText(String.valueOf(weekNumber));
launchAdapter();
}
}
});
}
public void launchAdapter(){
adapter = new MealPlannerAdapter(this, getSupportFragmentManager(), tabLayout.getTabCount(), weekNumber);
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
}
MealPlannerAdapter:
public class MealPlannerAdapter extends FragmentPagerAdapter {
Context context;
int totalTabs, weekNumber;
Static staticUrl;
private MealPlannerFragment mealPlannerFragment;
private RecipesFragment recipesFragment;
//String weekNumber;
public MealPlannerAdapter(Context c, FragmentManager fm, int totalTabs, int weekNumber) {
super(fm);
context = c;
this.weekNumber = weekNumber;
this.totalTabs = totalTabs;
staticUrl = new Static();
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
Bundle bundle = new Bundle();
bundle.putInt("weekNumber", weekNumber);
Log.v("Week_Number_mpad", String.valueOf(weekNumber));
MealPlannerFragment mealPlannerFragment = new MealPlannerFragment();
mealPlannerFragment.setArguments(bundle);
return mealPlannerFragment;
case 1:
RecipesFragment recipesFragment = new RecipesFragment();
return recipesFragment;
default:
return null;
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
// save the appropriate reference depending on position
switch (position) {
case 0:
Bundle bundle = new Bundle();
bundle.putInt("weekNumber", weekNumber);
Log.v("Week_Number_mpad", String.valueOf(weekNumber));
mealPlannerFragment = (MealPlannerFragment) createdFragment;
mealPlannerFragment.setArguments(bundle);
break;
case 1:
recipesFragment = (RecipesFragment) createdFragment;
break;
}
return createdFragment;
}
@Override
public int getCount() {
return totalTabs;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
}