mirror of
https://github.com/Nezumi-2711/PRM392.git
synced 2026-09-22 13:48:29 +00:00
Swipe to Delete (still bug)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
+7
@@ -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>
|
||||
Reference in New Issue
Block a user