Search code examples
androidandroid-tablayout

Delay in switching tabs android tablayout


I am having performance issue while switching between tabs in tablayout. In scenario one when i have less records i am able to switch between tabs easily and user doesn't fee any delay. Where as when i have more data user can feel lag like shown in below screenshot. Though screen loads after few seconds it is quite visible to user. Can someone suggest areas i can check to improve this further. Below is issue and current Fragment code...

UI -

  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_profile, container, false);
    dbConnection = new databaseHelper(getContext());
    dbConnection.getWritableDatabase();
    profileFragment = view.findViewById(R.id.profileFragment);
    downloadData = profileFragment.findViewById(R.id.dwnldData);
    refresh = profileFragment.findViewById(R.id.refreshdata);
    search = profileFragment.findViewById(R.id.search);
    removeFilter= profileFragment.findViewById(R.id.removeFilter);
    viewPager = (ViewPager) getActivity().findViewById(R.id.viewpager);
    currmelas = dbConnection.findMelas("YES","YES","");

    downloadData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewPager.setCurrentItem(0);
        }
    });



    if (viewPager.getCurrentItem()==1){
        candidateData = dbConnection.findHighCandData(mela_id,"1","");
    } else {
        candidateData = dbConnection.findHighCandData(mela_id,"","");
    }


    if (candidateData.size() <= 0) {
        if (currmelas.size() == 0 ){
            downloadData.setVisibility(View.VISIBLE);
            Handler handler = new Handler();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    if(userSettings.size()==0){
                        viewPager.setCurrentItem(3);
                    } else {
                        viewPager.setCurrentItem(0);
                    }
                }
            });

        }
    } else {            

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        setScrollView(candidateData);
                    }
                });
            }
        }, 100);

    }
    return view;
}

Solution

  • Move your data Loading to background worker and do not load information on the UI thread. This way you are not delayed while grabbing content between tab switching. I had the same problem, and had to move all my data loading to separate threads to enable clean smooth UI. After it is loaded, make sure you have set number of cached page off screen limit to keep what is important to avoid reloading on each swipe.

    more info here