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(); | |
} | |
} |