选择选项卡时在选项卡中加载 Google 个地图,而不是从头开始

Load Google Maps in a tab when tab is picked, and not from begining

我有一个带有 2 个选项卡的 TabLayout。 第一个选项卡(主选项卡)是列表视图中的商店列表 第二个选项卡与 Google 地图中的列表相同。

我注意到当我默认进入第一个选项卡(列表)时,GPS 图标会出现在通知栏中。

大多数情况下,用户会使用列表并且不需要加载所以我认为这是无用的电池损耗

如何在用户单击第二个选项卡而不是初始化时加载我的地​​图???

这是我的代码:

public class FragmentTabsPdv extends BaseActivity {

    private ArrayList<Pdv> listaPdv;
    Adapter adapter;
    ViewPager viewPager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ctx = this;
        setContentView(R.layout.tabs_pdv);

        PdvHandler db = new PdvHandler();
        listaPdv = db.getAllTiendas();
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        final ActionBar ab = getSupportActionBar();
        adapter = new Adapter(getSupportFragmentManager());

        if (ab != null){
            ab.setDisplayShowTitleEnabled(false);
            ab.setDisplayHomeAsUpEnabled(true);
            ab.setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_24dp);

        }
        toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        viewPager = (ViewPager) findViewById(R.id.viewpager);

        if (viewPager != null) {
            setupViewPager(viewPager);
            tabLayout.setupWithViewPager(viewPager);
        }
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                if (tab.getText().equals("Mapa")){

                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

    }

    public ArrayList<Pdv> getListaPdv() {
        return listaPdv;
    }


    static class Adapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragments = new ArrayList<>();
        private final List<String> mFragmentTitles = new ArrayList<>();

        public Adapter(FragmentManager fm) {
            super(fm);
        }

        public void addFragment(Fragment fragment, String title) {
            mFragments.add(fragment);
            mFragmentTitles.add(title);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragments.get(position);
        }

        @Override
        public int getCount() {
            return mFragments.size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitles.get(position);
        }
    }


    @Override
    public void onBackPressed() {
        setResult(RESULT_OK);
        finish();

    }

    private void setupViewPager(ViewPager viewPager) {
        adapter.addFragment(new ListPdvTabFragment(), "Lista");
        adapter.addFragment(new Fragment(), "Mapa");
        viewPager.setAdapter(adapter);


        }

    }

MapPdvFragment.java

public class MapPdvTabFragment extends Fragment implements GoogleMap.OnMarkerClickListener {
private MapView mapView;
private GoogleMap map;
private ArrayList<Pdv> pdvs;
private ViewPager pager;
private View fragmentView;
boolean showNoResults = false;
SharedPreferences prefs;
Context ctx;
private Pdv currentPdv;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    ctx = getActivity();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.tab_frag_map_pdv, container, false);
    fragmentView = v;

    Bundle localBundle = null;
    if (savedInstanceState != null)
        localBundle = savedInstanceState.getParcelable("mapViewBundle");

    // Gets the MapView from the XML layout and creates it
    mapView = (MapView) v.findViewById(R.id.map);

    // Gets to GoogleMap from the MapView and does initialization stuff

    mapView.onCreate(localBundle);
    mapView.onResume();// needed to get the map to display immediately

    map = mapView.getMap();
    map.getUiSettings().setMyLocationButtonEnabled(false);
    map.setOnMarkerClickListener(this);

    MapsInitializer.initialize(this.getActivity());

    FragmentTabsPdv parent = (FragmentTabsPdv) getActivity();
    pdvs = parent.getListaPdv();

    // Updates the location and zoom of the MapView
    map.setMyLocationEnabled(true);
    int zoom = 14;
    LatLng defaultLocation = null;
    for (Pdv pdv : pdvs) {
        if (pdv.getLatitude() != 0d) {
            defaultLocation = new LatLng(pdv.getLatitude(), pdv.getLongitude());
            break;
        }
    }
    if (defaultLocation == null || defaultLocation.latitude == 0.0d) {
        defaultLocation = new LatLng(23.6266557, -102.5375005);
        zoom = 5;
    }

    CameraUpdate here = CameraUpdateFactory.newLatLngZoom(defaultLocation, zoom);
    map.moveCamera(here);

    showNoResults = !(pdvs != null && pdvs.size() > 0);

    initPager();

    map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {
            clickPdv(currentPdv);

        }
    });
    return v;
}

@Override
public void onResume() {
    mapView.onResume();
    super.onResume();
    PdvHandler db = new PdvHandler();
    pdvs = db.getAllTiendas();

    displayPdvOnMap(pdvs); // Display markers
}

@Override
public void onPause() {
    super.onPause();
    if (mapView != null)
        mapView.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if (mapView != null)
        mapView.onSaveInstanceState(outState);
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

}

public void displayPdvOnMap(ArrayList<Pdv> tiendas) {
    map.clear();
    for (Pdv pdv : tiendas) {
        Marker marker = map
                .addMarker(new MarkerOptions()
                        .position(new LatLng(pdv.getLatitude(), pdv.getLongitude()))
                        .title(pdv.getTienda()).snippet(pdv.getCalle()));

        if (pdv.getDone() == 1)
            marker.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
        else
            marker.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));

        pdv.setMarker(marker);
    }
}

public void initPager() {

    pager = ((ViewPager) fragmentView.findViewById(R.id.pager));
    pager.setOffscreenPageLimit(3);
    pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        public void onPageScrollStateChanged(int paramAnonymousInt) {
        }

        public void onPageScrolled(int paramAnonymousInt1, float paramAnonymousFloat, int paramAnonymousInt2) {
        }

        public void onPageSelected(int position) {

            Pdv pdv = pdvs.get(position);
            if (pdv.getLatitude() != 0d) {
                Marker m = pdv.getMarker();
                m.showInfoWindow();
                // Center map on current marker
                CameraUpdate here = CameraUpdateFactory.newLatLngZoom(m.getPosition(), 14);
                map.animateCamera(here);
                // TODO Esta siendo un poco pesado la animacion
            } else {
                Toast toast = Toast.makeText(getActivity(),
                        ctx.getString(R.string.tienda_no_geolocalizada),Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();

            }

        }
    });
    pager.setSaveEnabled(false);
    PagerAdapter pagerAdapter = new PagerAdapter() {

        public void destroyItem(ViewGroup paramAnonymousViewGroup,
                                int paramAnonymousInt, Object paramAnonymousObject) {
            paramAnonymousViewGroup.removeView((View) paramAnonymousObject);
        }

        public int getCount() {

            if (showNoResults)
                return 1;
            if (pdvs != null)
                return pdvs.size();
            return 0;
        }

        public Object instantiateItem(View container, int position) {
            View view;
            LayoutInflater li = (LayoutInflater) getActivity()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (showNoResults) {
                view = li.inflate(R.layout.map_pager_empty, null);
            } else {
                view = li.inflate(R.layout.row_lista_pdv, null);
                final Pdv pdv = pdvs.get(position);
                TextView tienda_name = (TextView) view.findViewById(R.id.tienda_name);
                TextView direccion = (TextView) view.findViewById(R.id.tienda_dir);

                String sucursal = pdv.getSucursal();
                String calle = pdv.getCalle();

                if (sucursal == null) {
                    sucursal = pdv.getTienda();
                    if (sucursal == null)
                        sucursal = ctx.getString(R.string.sin_nombre);
                }

                if (calle == null) {
                    calle = pdv.getCiudad();
                    if (calle == null)
                        calle = ctx.getString(R.string.sin_calle);
                }


                tienda_name.setText(sucursal);
                direccion.setText(calle);

            ((ViewPager) container).addView(view, 0);
            return view;
        }

        public boolean isViewFromObject(View paramAnonymousView,Object paramAnonymousObject) {
            return paramAnonymousView == paramAnonymousObject;
        }
    };
    this.pager.setAdapter(pagerAdapter);

}

/**
 * Manda a la captura o despliga infos de captura
 *
 * @param pdv el punto de venta actual
 */
private void clickPdv(final Pdv pdv) {
    ListPdvTabFragment lptf = new ListPdvTabFragment();
    lptf.openPdv(getActivity(), pdv, 0);
}

@Override
public boolean onMarkerClick(Marker marker) {
    int i;
    i = getPdvPosition(marker);
    currentPdv = pdvs.get(i);

    if (i >= 0)
        pager.setCurrentItem(i, true);
    return false;
}

private int getPdvPosition(Marker marker) {
    int position = 0;
    for (Pdv pdv : pdvs) {
        Marker m = pdv.getMarker();
        String mId1 = m.getId();
        String mId2 = marker.getId();
        if (mId1.equals(mId2)) {
            return position;
        }
        position++;
    }
    return 0;
}

@Override
public void onStart() {
    super.onStart();
    prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
    String activityName = getClass().getSimpleName();
    prefs.edit().putString("FrontActivity", activityName).apply();
}

}

FragmentPagerAdapter 将始终同时加载您的两个片段(因为用户可以随时滑动到下一个选项卡),并且您不能使预加载片段的数量少于 2(每侧一个)。

如果需要,您可以在用户登陆 "Mapa" 片段后使用您已经覆盖的 onTabSelected 回调初始化地图。我想现在您是在 onCreate 中执行此操作,只需将其移动到您将在 Fragment 可见后调用的方法中即可。

这是一些代码:

更改您的 setupViewPager,以便保留对 mapa 片段的引用:

    private void setupViewPager(ViewPager viewPager) {
        adapter.addFragment(new ListPdvTabFragment(), "Lista");
        //Add mMapaFragment as a member of the activity
        mMapaFragment = new Fragment();
        adapter.addFragment(mMapaFragment, "Mapa");
        viewPager.setAdapter(adapter);
    }

然后在您的 mMapaFragment 进入视图时调用 setupMap 方法。

        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            // Check if your "Mapa" Fragment is selected, it's probably on position one
            if (arg0 == 1) {
               mMapaFragment.setupMap():
            }   
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

        }
    });

然后在setUpMap()方法中加载地图。