Swippen zum löschen der Einträge sollte eine einfache Methode sein. PHP-Script und Java-Klassen für das Löschen wird dann wie folgt aussehen:
delete.php
<?php
include 'dbconn.php';
$response = array();
$id = (isset($_POST['id'])) ? $_POST['id'] : die(json_encode(array('success' => -1), JSON_PRETTY_PRINT));
$delete = "DELETE FROM devices WHERE _id = :id";
$deleteQuery = $conn->db->prepare($delete);
$deleteQuery->bindParam(':id', $id, PDO:: PARAM_INT);
if ($deleteQuery->execute() && ($deleteQuery->rowCount() > 0) && $deleteQuery->errorCode() == 0) {
echo json_encode(array('success' => 1), JSON_PRETTY_PRINT);
} else {
echo json_encode(array('success' => -1), JSON_PRETTY_PRINT);
}
$deleteQuery->closeCursor();
$conn->db = null
?>
Eine Helfer-Klasse für das Löschen benötigen wir.
Delete.java
public class Delete {
private int success;
public int getSuccess() {
return success;
}
}
Wer hätte es gedacht – wir müssen unsere ApiService.java anpassen bzw. erweitern.
ApiService.java
@FormUrlEncoded
@POST("/api/delete.php")
Call<Delete> deleteDevice(
@Field("id")
String id
);
Es muss unsere Adapter-Klasse erweitert werden, benötigt wird dazu noch ein Callback-Interface und eine Methode – onItemRemove.
ItemRemoveCallback.java
public interface ItemRemoveCallback {
void get();
}
In DeviceAdapter legen wir eine Variable von ItemRemoveCallback an.
DeviceAdapter.java
private ItemRemoveCallback itemRemoveCallback;
public void onItemRemove(RecyclerView.ViewHolder viewHolder, final RecyclerView mRecyclerView, final ItemRemoveCallback itemRemoveCallback) {
this.itemRemoveCallback = itemRemoveCallback;
final int adapterPosition = viewHolder.getAdapterPosition();
final Devices.Details details = mDetails.get(adapterPosition);
Snackbar snackbar = Snackbar.make(mRecyclerView, "removed", Snackbar.LENGTH_LONG)
.setAction("undo", new View.OnClickListener() {
@Override
public void onClick(View view) {
mDetails.add(adapterPosition, details);
notifyItemInserted(adapterPosition);
mRecyclerView.scrollToPosition(adapterPosition);
}
})
.setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
super.onDismissed(snackbar, event);
if (event != DISMISS_EVENT_ACTION) {
itemRemoveCallback.get();
}
}
});
snackbar.show();
mDetails.remove(adapterPosition);
notifyItemRemoved(adapterPosition);
}
MainActivity.java
private ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
final String _id = details.get(viewHolder.getAdapterPosition()).getId();
adapter.onItemRemove(viewHolder, mRecyclerView, new ItemRemoveCallback() {
@Override
public void get() {
}
});
}
};
In der onCreate müssen wir simpleCallback dem ItemTouchHelper übergeben und anschließend an den RecyclerView „anhängen“.
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
In get() von onItemRemove handeln wir den Löschvorgang in der Datenbank ab.
@Override
public void get() {
Call<Delete> deleteCall = apiService.deleteDevice(_id);
deleteCall.enqueue(new Callback<Delete>() {
@Override
public void onResponse(Call<Delete> call, Response<Delete> response) {
if (response.body().getSuccess() != -1) {
Toast.makeText(getApplicationContext(), "ok", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<Delete> call, Throwable t) {
Log.e("TAG", t.getLocalizedMessage());
}
});
}