Hello.
Im struggling to make this sample working with the latest Android SDK 100.2.X with no sucess...
Could anyone help to make it work with new libraries?
Many thks!
https://github.com/aKhullar/arcgis-android-sdk-gradle-samples/tree/master/FeatureServiceTableQuery
| /* Copyright 2014 ESRI | |
| * | |
| * All rights reserved under the copyright laws of the United States | |
| * and applicable international laws, treaties, and conventions. | |
| * | |
| * You may freely redistribute and use this sample code, with or | |
| * without modification, provided you include the original copyright | |
| * notice and use restrictions. | |
| * | |
| * See the Sample code usage restrictions document for further information. | |
| * | |
| */ | |
| package com.arcgis.android.samples.cloudportal.featureservicetablequery; | |
| import android.app.Activity; | |
| import android.graphics.Color; | |
| import android.os.Bundle; | |
| import android.view.Menu; | |
| import android.view.MenuItem; | |
| import android.view.View; | |
| import android.widget.ArrayAdapter; | |
| import android.widget.Spinner; | |
| import android.widget.Toast; | |
| import com.esri.android.map.FeatureLayer; | |
| import com.esri.android.map.MapView; | |
| import com.esri.core.geodatabase.GeodatabaseFeatureServiceTable; | |
| import com.esri.core.map.CallbackListener; | |
| import com.esri.core.map.CodedValueDomain; | |
| import com.esri.core.map.Feature; | |
| import com.esri.core.map.FeatureResult; | |
| import com.esri.core.map.Field; | |
| import com.esri.core.tasks.query.QueryParameters; | |
| public class MainActivity extends Activity { | |
| public FeatureLayer featureLayer; | |
| public GeodatabaseFeatureServiceTable featureServiceTable; | |
| MapView mMapView; | |
| Spinner mDamageSpinner; | |
| Spinner mCauseSpinner; | |
| ArrayAdapter<String> damageAdapter; | |
| ArrayAdapter<String> causeAdapter; | |
| @Override | |
| protected void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| setContentView(R.layout.activity_main); | |
| // populate strings from resource | |
| String FEATURE_SERVICE_URL = getResources().getString(R.string.feature_service_url); | |
| final String DAMAGE_FIELD_NAME = getResources().getString(R.string.damage_field_name); | |
| final String CAUSE_FIELD_NAME = getResources().getString(R.string.cause_field_name); | |
| // get reference to the map in the layout | |
| mMapView = (MapView) findViewById(R.id.map); | |
| // create a GeodatabaseFeatureServiceTable from a feature service url | |
| featureServiceTable = new GeodatabaseFeatureServiceTable(FEATURE_SERVICE_URL, 0); | |
| // initialize the GeodatabaseFeatureService and populate it with features from the service | |
| featureServiceTable.initialize(new CallbackListener<GeodatabaseFeatureServiceTable.Status>() { | |
| @Override | |
| public void onCallback(GeodatabaseFeatureServiceTable.Status status) { | |
| // create a FeatureLayer from teh initialized GeodatabaseFeatureServiceTable | |
| featureLayer = new FeatureLayer(featureServiceTable); | |
| // emphasize the selected features by increasing the selection halo size and color | |
| featureLayer.setSelectionColor(Color.GREEN); | |
| featureLayer.setSelectionColorWidth(20); | |
| // add feature layer to map | |
| mMapView.addLayer(featureLayer); | |
| // set up spinners to contain values from the layer to query against | |
| setupQuerySpinners(); | |
| // Get the fields that will be used to query the layer. | |
| Field damageField = featureServiceTable.getField(DAMAGE_FIELD_NAME); | |
| Field causeField = featureServiceTable.getField(CAUSE_FIELD_NAME); | |
| // Retrieve the possible domain values for each field and add to the spinner data adapters. | |
| CodedValueDomain damageDomain = (CodedValueDomain) damageField.getDomain(); | |
| CodedValueDomain causeDomain = (CodedValueDomain) causeField.getDomain(); | |
| damageAdapter.addAll(damageDomain.getCodedValues().values()); | |
| causeAdapter.addAll(causeDomain.getCodedValues().values()); | |
| // On the main thread, connect up the spinners with the filled data adapters. | |
| runOnUiThread(new Runnable() { | |
| @Override | |
| public void run() { | |
| mDamageSpinner.setAdapter(damageAdapter); | |
| mCauseSpinner.setAdapter(causeAdapter); | |
| } | |
| }); | |
| } | |
| @Override | |
| public void onError(Throwable throwable) { | |
| showToast("Error initializing FeatureServiceTable"); | |
| } | |
| }); | |
| } | |
| public void onClick_okButton(View v) { | |
| // Build and execute the query. | |
| // First, check layer exists, and clear any previous selection from the layer. | |
| if (featureLayer == null) { | |
| showToast("Feature layer is not set."); | |
| return; | |
| } | |
| featureLayer.clearSelection(); | |
| // Build query predicates to construct a query where clause from selected values. | |
| String damageType = String.valueOf(mDamageSpinner.getSelectedItem()); | |
| String primCause = String.valueOf(mCauseSpinner.getSelectedItem()); | |
| String whereClause = "typdamage LIKE '" + damageType + "' AND primcause LIKE '" + primCause + "'"; | |
| // Create query parameters, based on the constructed where clause. | |
| QueryParameters queryParams = new QueryParameters(); | |
| queryParams.setWhere(whereClause); | |
| // Execute the query and create a callback for dealing with the results of the query. | |
| featureServiceTable.queryFeatures(queryParams, new CallbackListener<FeatureResult>() { | |
| @Override | |
| public void onError(Throwable ex) { | |
| // Highlight errors to the user. | |
| showToast("Error querying FeatureServiceTable"); | |
| } | |
| @Override | |
| public void onCallback(FeatureResult objs) { | |
| // If there are no query results, inform user. | |
| if (objs.featureCount() < 1) { | |
| showToast("No results"); | |
| return; | |
| } | |
| // Report number of results to user. | |
| showToast("Found " + objs.featureCount() + " features."); | |
| // Iterate the results and select each feature. | |
| for (Object objFeature : objs) { | |
| Feature feature = (Feature) objFeature; | |
| featureLayer.selectFeature(feature.getId()); | |
| } | |
| } | |
| }); | |
| } | |
| public void setupQuerySpinners() { | |
| // Get the spinner controls from the layout. | |
| mDamageSpinner = (Spinner) findViewById(R.id.damageSpinner); | |
| mCauseSpinner = (Spinner) findViewById(R.id.causeSpinner); | |
| // Set up array adapters to contain the values in the spinners. | |
| damageAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item); | |
| causeAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item); | |
| } | |
| public void showToast(final String message) { | |
| // Show toast message on the main thread only; this function can be | |
| // called from query callbacks that run on background threads. | |
| runOnUiThread(new Runnable() { | |
| @Override | |
| public void run() { | |
| Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show(); | |
| } | |
| }); | |
| } | |
| @Override | |
| public boolean onCreateOptionsMenu(Menu menu) { | |
| // Inflate the menu; this adds items to the action bar if it is present. | |
| getMenuInflater().inflate(R.menu.main, menu); | |
| return true; | |
| } | |
| @Override | |
| public boolean onOptionsItemSelected(MenuItem item) { | |
| // Handle action bar item clicks here. The action bar will | |
| // automatically handle clicks on the Home/Up button, so long | |
| // as you specify a parent activity in AndroidManifest.xml. | |
| int id = item.getItemId(); | |
| return id == R.id.action_settings || super.onOptionsItemSelected(item); | |
| } | |
| @Override | |
| protected void onDestroy() { | |
| super.onDestroy(); | |
| } | |
| @Override | |
| protected void onPause() { | |
| super.onPause(); | |
| mMapView.pause(); | |
| } | |
| @Override | |
| protected void onResume() { | |
| super.onResume(); | |
| mMapView.unpause(); | |
| } | |
| } |