Swipe to Delete (still bug)

This commit is contained in:
phanhuuloi27
2022-07-03 10:54:25 +07:00
parent 384ee553a3
commit b40e0b6596
10 changed files with 246 additions and 57 deletions
@@ -5,6 +5,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Location;
import android.os.Bundle;
import android.text.TextUtils;
@@ -14,6 +15,7 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
@@ -23,6 +25,7 @@ import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -32,24 +35,20 @@ import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.android.material.snackbar.Snackbar;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.rengwuxian.materialedittext.MaterialEditText;
import com.waterbase.foodify.Common.Common;
import com.waterbase.foodify.Database.Database;
import com.waterbase.foodify.Model.MyResponse;
import com.waterbase.foodify.Model.Notification;
import com.waterbase.foodify.Helper.RecyclerItemTouchHelper;
import com.waterbase.foodify.Interface.RecyclerItemTouchHelperListener;
import com.waterbase.foodify.Model.Order;
import com.waterbase.foodify.Model.Request;
import com.waterbase.foodify.Model.Sender;
import com.waterbase.foodify.Model.Token;
import com.waterbase.foodify.Remote.APIService;
import com.waterbase.foodify.Remote.IGoogleService;
import com.waterbase.foodify.ViewHolder.CartAdapter;
import com.waterbase.foodify.ViewHolder.CartViewHolder;
import org.json.JSONArray;
import org.json.JSONException;
@@ -70,7 +69,7 @@ import retrofit2.Callback;
import retrofit2.Response;
public class Cart extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,
LocationListener {
LocationListener, RecyclerItemTouchHelperListener {
String address = null;
@@ -88,6 +87,8 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
APIService mService;
RelativeLayout rootLayout;
//Location
private LocationRequest mLocationRequest;
private GoogleApiClient mGoogleApiClient;
@@ -150,6 +151,11 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
rootLayout = findViewById(R.id.rootLayout);
//Swipe to delete
ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this);
new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);
txtTotalPrice = (TextView) findViewById(R.id.total);
btnPlace = (FButton) findViewById(R.id.btnPlaceOrder);
@@ -437,4 +443,46 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
mLastLocation = location;
displayLocation();
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) {
if(viewHolder instanceof CartViewHolder)
{
String name = ((CartAdapter)recyclerView.getAdapter()).getItem(viewHolder.getAdapterPosition()).getProductName();
Order deleteItem = ((CartAdapter)recyclerView.getAdapter()).getItem(viewHolder.getAdapterPosition());
int deleteIndex = viewHolder.getAdapterPosition();
adapter.removeItem(deleteIndex);
new Database(getBaseContext()).removeFromCart(deleteItem.getProductId(), Common.currentUser.getPhone());
updateTotalPrice();
//Make Snackbar
Snackbar snackbar = Snackbar.make(rootLayout, name + " đã xoá khỏi giỏ hàng của bạn!", Snackbar.LENGTH_LONG);
snackbar.setAction("Hoàn tác", new View.OnClickListener() {
@Override
public void onClick(View v) {
adapter.restoreItem(deleteItem, deleteIndex);
new Database(getBaseContext()).addToCart(deleteItem);
updateTotalPrice();
}
});
snackbar.setActionTextColor(Color.YELLOW);
snackbar.show();
}
}
public void updateTotalPrice()
{
//Calculate total price
float total = 0;
List<Order> orders = new Database(getBaseContext()).getCarts();
for (Order item : orders)
total += (Float.parseFloat(item.getPrice())) * (Float.parseFloat(item.getQuantity())) * (100 - Long.parseLong(item.getDiscount()))/100;
Locale locale = new Locale("vi", "VN");
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
txtTotalPrice.setText(fmt.format(total));
}
}
@@ -59,6 +59,12 @@ public class Database extends SQLiteAssetHelper {
db.execSQL(query);
}
public void removeFromCart(String productId, String phone) {
SQLiteDatabase db = getReadableDatabase();
String query = String.format("DELETE FROM OrderDetail WHERE UserPhone='%s' and ProductId='%s'", phone, productId);
db.execSQL(query);
}
public void cleanCart() {
SQLiteDatabase db = getReadableDatabase();
String query = String.format("DELETE FROM OrderDetail");
@@ -0,0 +1,65 @@
package com.waterbase.foodify.Helper;
import android.graphics.Canvas;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import com.waterbase.foodify.Interface.RecyclerItemTouchHelperListener;
import com.waterbase.foodify.ViewHolder.CartViewHolder;
public class RecyclerItemTouchHelper extends ItemTouchHelper.SimpleCallback {
private RecyclerItemTouchHelperListener listener;
public RecyclerItemTouchHelper(int dragDirs, int swipeDirs, RecyclerItemTouchHelperListener listener) {
super(dragDirs, swipeDirs);
this.listener = listener;
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
if(listener != null)
listener.onSwiped(viewHolder, direction, viewHolder.getAdapterPosition());
}
@Override
public int convertToAbsoluteDirection(int flags, int layoutDirection) {
return super.convertToAbsoluteDirection(flags, layoutDirection);
}
@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
View foregroundView = ((CartViewHolder)viewHolder).view_foreground;
getDefaultUIUtil().clearView(foregroundView);
}
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
View foregroundView = ((CartViewHolder)viewHolder).view_foreground;
getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY, actionState, isCurrentlyActive);
}
@Override
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
if(viewHolder != null)
{
View foregroundView = ((CartViewHolder)viewHolder).view_foreground;
getDefaultUIUtil().onSelected(foregroundView);
}
}
@Override
public void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
View foregroundView = ((CartViewHolder)viewHolder).view_foreground;
getDefaultUIUtil().onDrawOver(c, recyclerView, foregroundView, dX, dY, actionState, isCurrentlyActive);
}
}
@@ -0,0 +1,7 @@
package com.waterbase.foodify.Interface;
import androidx.recyclerview.widget.RecyclerView;
public interface RecyclerItemTouchHelperListener {
void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position);
}
@@ -1,69 +1,24 @@
package com.waterbase.foodify.ViewHolder;
import android.content.Context;
import android.graphics.Color;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.cepheuen.elegantnumberbutton.view.ElegantNumberButton;
import com.squareup.picasso.Picasso;
import com.waterbase.foodify.Cart;
import com.waterbase.foodify.Common.Common;
import com.waterbase.foodify.Database.Database;
import com.waterbase.foodify.Interface.ItemClickListener;
import com.waterbase.foodify.Model.Order;
import com.waterbase.foodify.R;
import org.w3c.dom.Text;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
class CartViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener {
public TextView txt_card_item, txt_price, txtDiscount;
public ElegantNumberButton btn_quantity;
public ImageView cart_image;
private ItemClickListener itemClickListener;
public void setTxt_card_item(TextView txt_card_item) {
this.txt_card_item = txt_card_item;
}
public CartViewHolder(View itemView) {
super(itemView);
txt_card_item = (TextView) itemView.findViewById(R.id.cart_item_name);
txt_price = (TextView) itemView.findViewById(R.id.cart_item_Price);
txtDiscount = (TextView) itemView.findViewById(R.id.txtDiscount);
btn_quantity = (ElegantNumberButton) itemView.findViewById(R.id.btn_quantity);
cart_image = (ImageView) itemView.findViewById(R.id.cart_image);
itemView.setOnCreateContextMenuListener(this);
}
@Override
public void onClick(View v) {
}
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View v, ContextMenu.ContextMenuInfo menuInfo) {
contextMenu.setHeaderTitle("Tuỳ chọn:");
contextMenu.add(0, 0, getAdapterPosition(), Common.DELETE);
}
}
public class CartAdapter extends RecyclerView.Adapter<CartViewHolder>{
private List<Order> listData = new ArrayList<>();
@@ -130,4 +85,21 @@ public class CartAdapter extends RecyclerView.Adapter<CartViewHolder>{
public int getItemCount() {
return listData.size();
}
public Order getItem(int position)
{
return listData.get(position);
}
public void removeItem(int position)
{
listData.remove(position);
notifyItemRemoved(position);
}
public void restoreItem(Order item, int position)
{
listData.add(position, item);
notifyItemInserted(position);
}
}
@@ -0,0 +1,55 @@
package com.waterbase.foodify.ViewHolder;
import android.view.ContextMenu;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.cepheuen.elegantnumberbutton.view.ElegantNumberButton;
import com.waterbase.foodify.Common.Common;
import com.waterbase.foodify.Interface.ItemClickListener;
import com.waterbase.foodify.R;
public class CartViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener {
public TextView txt_card_item, txt_price, txtDiscount;
public ElegantNumberButton btn_quantity;
public ImageView cart_image;
public RelativeLayout view_background;
public LinearLayout view_foreground;
private ItemClickListener itemClickListener;
public void setTxt_card_item(TextView txt_card_item) {
this.txt_card_item = txt_card_item;
}
public CartViewHolder(View itemView) {
super(itemView);
txt_card_item = (TextView) itemView.findViewById(R.id.cart_item_name);
txt_price = (TextView) itemView.findViewById(R.id.cart_item_Price);
txtDiscount = (TextView) itemView.findViewById(R.id.txtDiscount);
btn_quantity = (ElegantNumberButton) itemView.findViewById(R.id.btn_quantity);
cart_image = (ImageView) itemView.findViewById(R.id.cart_image);
view_background = (RelativeLayout) itemView.findViewById(R.id.view_background);
view_foreground = (LinearLayout) itemView.findViewById(R.id.view_foreground);
itemView.setOnCreateContextMenuListener(this);
}
@Override
public void onClick(View v) {
}
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View v, ContextMenu.ContextMenuInfo menuInfo) {
contextMenu.setHeaderTitle("Tuỳ chọn:");
contextMenu.add(0, 0, getAdapterPosition(), Common.DELETE);
}
}
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
</vector>
@@ -2,6 +2,7 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rootLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg4"
@@ -8,9 +8,37 @@
app:cardElevation="4dp"
>
<RelativeLayout
android:id="@+id/view_background"
android:background="@color/bgRowBackground"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/delete_icon"
android:src="@drawable/ic_baseline_delete_24"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_width="30dp"
android:layout_height="30dp"
/>
<TextView
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/delete_icon"
android:text="Xoá"
android:textColor="@color/white"
android:textSize="13sp"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
<LinearLayout
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:id="@+id/view_foreground"
android:background="@color/white"
android:orientation="horizontal"
android:layout_gravity="center_vertical"
android:layout_width="match_parent"
@@ -18,7 +46,7 @@
<ImageView
android:id="@+id/cart_image"
android:layout_marginLeft="5dp"
android:layout_margin="10dp"
android:layout_width="70dp"
android:layout_height="70dp"/>
@@ -18,4 +18,6 @@
<color name="overlayBackground">#7f333639</color>
<color name="overlayActionBar">#0e0d0e</color>
<color name="red">#FA0202</color>
<color name="bgRowBackground">#FA315B</color>
</resources>