MySQL-Datenbank mit Square Libraries – Delete Swip Left/Right Teil 8

von Ludy geschrieben am und aktualisiert am
Kategorien App Tutorials, Apps, MySQL Datenbank
Schlagwörter , , , , ,

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