Ich baue eine App, die die Klingeltöne der Leute beruhigen wird, basierend auf ihrem Standort. Ich verwende eine PlacePicker-API, speichere den Namen des Ortes in SharedPreferences und füge ihn zu einer ListView hinzu. Ich habe jedoch Probleme mit dem Löschen der Elemente. Wenn der Benutzer auf ein Listenansichtselement klickt, sollte es aus SharedPreferences gelöscht werden. Das Problem ist, nach dem ersten Löschen, meine Methode zu verweisen, welche SharedPrefs Artikel zu löschen ist schlecht und es funktioniert nicht. Wie kann ich es reparieren?Wie kann ich das Löschen dieser Elemente aus SharedPreferences behandeln?
public class MainActivity extends AppCompatActivity implements LocationListener {
PlacePicker.IntentBuilder builder;
int PLACE_PICKER_REQUEST;
ListView placeListView;
ArrayList<String> placeArrayList;
ArrayAdapter<String> arrayAdapter;
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
ArrayList<Double> latitudeList;
Integer counter;
LocationManager locationManager;
String provider;
double lat;
double lng;
Place place;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
placeListView = (ListView) findViewById(R.id.placeListView);
latitudeList = new ArrayList<>();
placeArrayList = new ArrayList<String>();
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, placeArrayList);
placeListView.setAdapter(arrayAdapter);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
provider = locationManager.getBestProvider(new Criteria(), false);
placeListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
new AlertDialog.Builder(MainActivity.this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Are you sure?")
.setMessage("Do you want to delete this place?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
placeArrayList.remove(position);
SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
sharedPreferences.edit().remove("name" + position).apply();
arrayAdapter.notifyDataSetChanged();
}
})
.setNegativeButton("No", null)
.show();
return false;
}
});
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Location location = locationManager.getLastKnownLocation(provider);
if (location != null){
lat = location.getLatitude();
lng = location.getLongitude();
Toast.makeText(getApplicationContext(), String.valueOf(lat) + String.valueOf(lng), Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(), "Unable to get location", Toast.LENGTH_LONG).show();
}
sharedPreferences = getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
editor = sharedPreferences.edit();
sharedPreferences.edit().putInt("counter", 0);
counter = sharedPreferences.getInt("counter", -1);
arrayAdapter.notifyDataSetChanged();
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PLACE_PICKER_REQUEST = 1;
builder = new PlacePicker.IntentBuilder();
pickPlace();
}
});
}
public void pickPlace(){
try {
startActivityForResult(builder.build(this), PLACE_PICKER_REQUEST);
} catch (GooglePlayServicesRepairableException e) {
e.printStackTrace();
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PLACE_PICKER_REQUEST) {
if (resultCode == RESULT_OK) {
place = PlacePicker.getPlace(data, this);
// String toastMsg = String.format("Place: %s", place.getName());
//Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
counter = sharedPreferences.getInt("counter", -1);
counter = counter + 1;
sharedPreferences.edit().putInt("counter", counter).apply();
LatLng latLng = place.getLatLng();
sharedPreferences.edit().putFloat("latitude" + String.valueOf(counter), (float) latLng.latitude).apply();
sharedPreferences.edit().putFloat("longitude" + String.valueOf(counter), (float) latLng.longitude).apply();
placeArrayList.add(place.getName().toString());
sharedPreferences.edit().putString("name" + placeArrayList.size(), place.getName().toString()).apply();
arrayAdapter.notifyDataSetChanged();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.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();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onLocationChanged(Location location) {
for (int i = counter; i >= 0; i--){
if (lat >= sharedPreferences.getFloat("latitude" + String.valueOf(i), -1) - .005 &&
lat <= sharedPreferences.getFloat("latitude" + String.valueOf(i), -1) + .005 &&
lng >= sharedPreferences.getFloat("longitude" + String.valueOf(i), -1) - .005 &&
lng <= sharedPreferences.getFloat("longitude" + String.valueOf(i), -1) + .005){
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamVolume(AudioManager.STREAM_RING, AudioManager.RINGER_MODE_SILENT, AudioManager.FLAG_SHOW_UI);
}
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
Wie verwende ich das, um auf das SharedPreferences-Element zu verweisen, das ich brauche? Mein Problem ist, dass nach dem Löschen eines Elements die Elemente in der Listenansicht weiter nach unten verschoben werden und ich nicht mehr "Position" verwenden kann, um auf sie in SharedPreferences zu verweisen. Wenn zum Beispiel der dritte Gegenstand gelöscht wird, nimmt der vierte Platz ein. dann, wenn der Benutzer versucht, diesen zu löschen, können sie nicht, weil es ein Tag von 4 hat, wenn die Position 3 – felix
ist, egal, verstehe ich es jetzt. Vielen Dank! – felix
Ich bin froh, dass es funktioniert :) –