मैं अपने ऐप में Google मानचित्र और इसकी क्लस्टरिंग उपयोगिता का उपयोग कर रहा हूं। क्लस्टरिंग स्वयं ठीक काम कर रही है, लेकिन जब मैं कॉन्फ़िगरेशन परिवर्तनों से निपटने का प्रयास करता हूं तो मुझे समस्या है।एंड्रॉइड, कॉलबैक जब नक्शा क्लस्टरिंग पूरा हो जाता है
- उपयोगकर्ता एक स्क्रीन है, जो एक
fragment
है पर एक नक्शा देखता है:यह मेरा मामला है।
- क्लस्टरिंग पूरा होने पर, मानचित्र पर मार्कर दिखाई देते हैं। उपयोगकर्ता
markers
के साथ बातचीत कर सकते हैं। - जब उपयोगकर्ता का चयन करता है, तो इसे हाइलाइट किया जाता है और
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
के लिए नहीं एक प्रतिक्रिया प्रदान करना चाहिए: मुझे लगता है मैं इस मानक क्लस्टरिंग कोड अपडेट करना होगा लगता है। लेकिन मैं मानक कोड को संशोधित नहीं करना चाहता हूं।
क्या इस मामले को संभालने का एक बेहतर तरीका है?
आप OnMapLoadedCallback' का उपयोग कर 'की कोशिश की है खत्म? प्रलेखन के अनुसार (https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback) 'onMapLoaded()' को कॉल किया गया है जब मानचित्र ने – antonio
प्रतिपादन समाप्त कर दिया है, ठीक है, यह ठीक हो सकता है, लेकिन समस्या यह है कि मैं सर्वर से डेटा प्राप्त होने के बाद मार्कर और क्लस्टर को आकर्षित कर सकता हूं, लेकिन कभी-कभी डेटा प्राप्त होने से पहले नक्शा लोड किया जाता है (कनेक्टिविटी मुद्दों आदि के कारण)। तो शायद यह काम नहीं करेगा। – rofl