BharathRao
BharathRao

Reputation: 2046

Progress bar loading before I select the Tab

Here is my code for Tab Initialization:

    private void initTabs() {

        serviceTabs.addTab(serviceTabs.newTab().setText("Request Appointment"));
        serviceTabs.addTab(serviceTabs.newTab().setText("Online Booking"));   
        serviceTabs.addTab(serviceTabs.newTab().setText("Feedback"));    
        serviceViewpager.setOffscreenPageLimit(serviceTabs.getTabCount());    
        final ViewPageAdapter adapter = new ViewPageAdapter(getChildFragmentManager(), serviceTabs.getTabCount(),
                mContext);    
        serviceViewpager.setAdapter(adapter);    
        serviceViewpager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(serviceTabs));    
        serviceTabs.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {  
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                serviceViewpager.setCurrentItem(tab.getPosition());
            }   
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                Log.i("", "on tab unselected Service");
            }    
            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                Log.i("", "on tab reselected Service ");
            }
        });
    }

    private class ViewPageAdapter extends FragmentStatePagerAdapter {
        int mNumOfTabs;   
        Context context;    
        ViewPageAdapter(FragmentManager fm, int numOfTabs, Context context) {
            super(fm);
            this.mNumOfTabs = numOfTabs;
            this.context = context;
        }

        @Override
        public Fragment getItem(int position) {    
            switch (position) {   
                case 0:
                    return new CustomizeFragment();    
                case 1:
                    Bundle url = new Bundle();                      url.putString(Constants.WEB_URL,Constants.APPOINTMENT_ONLINE_BOOKING);
                    return WebViewFragment.createInstance(url);

                case 2:
                    return new CustomizeFragment();

                default:
                    return null;
            }
        }   
        @Override
        public int getCount() {
            return mNumOfTabs;
        }
    }   
    @Override
    public void onDestroyView() {
        super.onDestroyView();           
        unbinder.unbind();
    }

And I'm having the progress bar loading inside the WebViewFragment as Follows:

 public static WebViewFragment createInstance(Bundle urlArgs) {
        WebViewFragment webView = new WebViewFragment();
        webView.setArguments(urlArgs);
        return webView;
    }
    @Override
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle saveInstanceState) {
        rootView = layoutInflater.inflate(R.layout.load_web_view, container, false);
        activity = getActivity();
        url=getArguments().getString(Constants.WEB_URL);
        mContext = activity.getApplicationContext();
        serviceAppointmentView = (WebView) rootView.findViewById(R.id.webView);    
        loadData();
        return rootView;
    }   
public void loadData()
{
    serviceAppointmentView.clearView();
    webSettings = serviceAppointmentView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setSupportZoom(true);
    webSettings.setBuiltInZoomControls(true);
    webSettings.setLoadWithOverviewMode(true);
    webSettings.setUseWideViewPort(true);

    progress = new Progress(activity);
    pDialog = progress.showProgress();
    pDialog.setCanceledOnTouchOutside(true);
    serviceAppointmentView.loadUrl(url);
    serviceAppointmentView.setWebViewClient(new 
    DealerWebViewClient());
}
private class DealerWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
    {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        progress.dismissProgress(pDialog);
    }
}

Im Using the custom progress bar for Online Booking Tab. The problem here is the Progress begins to load before I tap the Online Booking tab. Please tell me where i'm doing the mistake or how could be this solved...Thanks for patiently looking on my code and any suggestions will be helpful for me...!

Upvotes: 1

Views: 1449

Answers (4)

venu46
venu46

Reputation: 409

By default Viewpager can load the three pages at a time.one is the current page and remaining are left and right side of the current page.So if you open your activity opposite sides of your fragments will also intializes.so overrride this method in your fragment below your onCreate()

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
 super.setUserVisibleHint(isVisibleToUser);
 if (isVisibleToUser) {
    loaddata(); 
 }else{

 }
}

This will call whenever your fragment is visible to user

Upvotes: 1

Aj 27
Aj 27

Reputation: 2427

I hope it will help you.

As viewpager loads adjacent fragments of current fragment , Its better to use progressbar in xml like this following while working with the viewpager inseted of progressdialog or something :

<ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center_horizontal"
        android:visibility="visible" />

Upvotes: 1

Maksym V.
Maksym V.

Reputation: 2937

ViewPage has DEFAULT_OFFSCREEN_PAGES value which is 1, and it is the min value, you can not set it to 0.

It means that when you are initing the viewpager and the fragments are added, when it does init fragment at postion 0 it does also init fragment at position 1.

There is a method, inside Fragment.class

setUserVisibleHint(boolean)

which is called when the fragment is visible to user(getting selected in viewPager).

You can ovveride it to achieve your loading progress start whenever you need. Keep inmind that it is also fired before

onCreateView()

You can check if view is already inflated checking if any view is not null.

Upvotes: 3

Vishal G. Gohel
Vishal G. Gohel

Reputation: 1033

View pager will by default load atleast 1 on the right and one on the left tab of current tab. It is done so, mostly because there is a point when u slide viewpager, when certain area of both tabs is visible. For those smooth transitions preloading is required.

To prevent this you can use this method setUserVisibleHint().

Like below code:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
 super.setUserVisibleHint(isVisibleToUser);
 if (isVisibleToUser) {
    // load data here
 }else{

 }
}

Upvotes: 1

Related Questions