5

मैं अपने ऐप में Google मानचित्र और इसकी क्लस्टरिंग उपयोगिता का उपयोग कर रहा हूं। क्लस्टरिंग स्वयं ठीक काम कर रही है, लेकिन जब मैं कॉन्फ़िगरेशन परिवर्तनों से निपटने का प्रयास करता हूं तो मुझे समस्या है।एंड्रॉइड, कॉलबैक जब नक्शा क्लस्टरिंग पूरा हो जाता है

  1. उपयोगकर्ता एक स्क्रीन है, जो एक fragment है पर एक नक्शा देखता है:

    यह मेरा मामला है।

  2. क्लस्टरिंग पूरा होने पर, मानचित्र पर मार्कर दिखाई देते हैं। उपयोगकर्ता markers के साथ बातचीत कर सकते हैं।
  3. जब उपयोगकर्ता का चयन करता है, तो इसे हाइलाइट किया जाता है और BottomSheet प्रदर्शित करने के लिए विस्तारित किया जाता है।

उपयोगकर्ता स्क्रीन (अर्थात विन्यास परिवर्तन होता है) घूमता है, तो मैं बचाने क्या मार्कर onSaveInstanceState का उपयोग कर चुना गया था (वास्तव में मैं मार्कर खुद को बचाने नहीं है, लेकिन आईडी की तरह संबंधित List प्रविष्टि के लिए केवल एक लिंक)। फिर, मैं उस उपयोगकर्ता चयन को पुनर्स्थापित करना चाहता हूं जो कॉन्फ़िगरेशन परिवर्तन से पहले था।

ही क्लस्टरिंग है इस तरह मार डाला:

clusterManager.clearItems(); 
clusterManager.addItems(eventManager.getEventList()); 
clusterManager.cluster(); 

इस कोड, निष्पादित किया जाता है जब डेटा सर्वर से प्राप्त किया जाता है। जब क्लस्टरिंग निष्पादित की जाती है, तो सभी markers, जाहिर है, भी पुनर्निर्मित होते हैं। तो पिछले उपयोगकर्ता चयन को हाइलाइट करने के लिए (पिछला), मुझे पता होना चाहिए कि क्लस्टरिंग उपयोगिता उसके ऑपरेशन को कब समाप्त करती है।

clusterManager.getRenderer()).getMarker(<param>) 

और

clusterManager.getRenderer()).getClusterItem(<param>) 

अन्यथा, इन null कभी कभी वापस आ जाएगी, अगर क्लस्टरिंग कार्य अभी तक पूर्ण नहीं है: उस समय तक मुझे यकीन है कि मैं सुरक्षित रूप से की तरह इस तरह के कार्यों का उपयोग कर सकते है।

हालांकि, क्लस्टरिंग पूर्ण होने पर क्लस्टरिंग उपयोगिता (यानी ClusterManager) से प्रतिक्रिया प्राप्त करने के लिए मुझे उचित तरीका नहीं मिल रहा है। ,

/** 
    * Runs the clustering algorithm in a background thread, then re-paints when results come back. 
    */ 
    private class ClusterTask extends AsyncTask<Float, Void, Set<? extends Cluster<T>>> { 
     @Override 
     protected Set<? extends Cluster<T>> doInBackground(Float... zoom) { 
      mAlgorithmLock.readLock().lock(); 
      try { 
       return mAlgorithm.getClusters(zoom[0]); 
      } finally { 
       mAlgorithmLock.readLock().unlock(); 
      } 
     } 

     @Override 
     protected void onPostExecute(Set<? extends Cluster<T>> clusters) { 
      mRenderer.onClustersChanged(clusters); 
     } 
    } 

मुझे लगता है कि onPostExecute कि क्लस्टरिंग किया जाता है (मेरे fragment) की तरह ही है, लेकिन ClusterManager के एक उपयोगकर्ता के लिए Renderer के लिए नहीं एक प्रतिक्रिया प्रदान करना चाहिए: मुझे लगता है मैं इस मानक क्लस्टरिंग कोड अपडेट करना होगा लगता है। लेकिन मैं मानक कोड को संशोधित नहीं करना चाहता हूं।

क्या इस मामले को संभालने का एक बेहतर तरीका है?

+1

आप OnMapLoadedCallback' का उपयोग कर 'की कोशिश की है खत्म? प्रलेखन के अनुसार (https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback) 'onMapLoaded()' को कॉल किया गया है जब मानचित्र ने – antonio

+0

प्रतिपादन समाप्त कर दिया है, ठीक है, यह ठीक हो सकता है, लेकिन समस्या यह है कि मैं सर्वर से डेटा प्राप्त होने के बाद मार्कर और क्लस्टर को आकर्षित कर सकता हूं, लेकिन कभी-कभी डेटा प्राप्त होने से पहले नक्शा लोड किया जाता है (कनेक्टिविटी मुद्दों आदि के कारण)। तो शायद यह काम नहीं करेगा। – rofl

उत्तर

0

आप इस बारे में गलत तरीके से जा रहे हैं।

आप को लागू करना चाहिए:

class YourClusterItemRenderer extends DefaultClusterRenderer<YourClusterItem> 

और ClusterManager करने के लिए इसे इस तरह रेंडरर के रूप में स्थापित: onBeforeClusterRendered

mClusterManager.setRenderer(new YourClusterItemRenderer(...)); 

अवहेलना YourClusterItemRenderer के तरीकों onBeforeClusterItemRendered और और वहाँ आप प्रत्येक मार्कर के अनुसार कैसा दिखता बदल सकते हैं आपके सर्वर से पैरामीटर के अनुसार आपका तर्क।

तो जब ClusterManager प्रतिपादन अपने सभी मार्करों पहले से ही लग रही है जैसे आप चाहते हैं उन्हें उपयोगकर्ता राज्य आदि के अनुसार

संबंधित मुद्दे