Refre sh фрагмент в TabLayout по внешней кнопке - PullRequest
0 голосов
/ 14 марта 2020

У меня есть активность с 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();
    }
}
...