Android application swipe left to right and right to left delete recyclerview and undo view like gmail
Android
Application
Apk
recyclerview
gmail
swipe
- By Code solution
- Jan 20th, 2021
- 0 comments
- 1
Android application swipe left to right and right to left delete recyclerview and undo view examples here.
The RecyclerView is a more advanced and more flexible version of the ListView. This new component is a big step because the ListView is one of the most used UI widgets. The CardView widget, on the other hand, is a new component that does not “upgrade” an existing component.
Creating New Project
- Create a new project in Android Studio from File ⇒ New Project. When selecting Empty Activity and proceed.
- After create a project add dependencies in build.gradle(Module:app) like that.
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'com.android.support:recyclerview-v7:28.+' implementation 'com.android.support:cardview-v7:28.+' implementation 'com.android.support:design:28.+' }
- After Open activity_main.xml under res ⇒ layouts and add this code.
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/linear" android:background="#e4e0e0" tools:context=".MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp"/> </android.support.design.widget.CoordinatorLayout>
- After then create item layout under res ⇒ layouts and add this code.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="5dp" android:paddingLeft="5dp" android:paddingRight="5dp" tools:context=".MainActivity" tools:ignore="NamespaceTypo"> <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="90dp" android:layout_gravity="center" app:cardBackgroundColor="#ffffff" android:layout_marginTop="0dp" card_view:cardCornerRadius="1dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/tv" android:height="90dp" android:gravity="center" android:paddingLeft="10dp" android:text="Code" android:textColor="#000" android:textStyle="bold" android:textSize="18sp" /> </LinearLayout> </android.support.v7.widget.CardView> </RelativeLayout>
- Create a java (model) class file under java ⇒ package name Model
package com.wapptech.swipe; public class Model { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
- After then Create a adapter (Adapter) file under java ⇒ package name Model
package com.wapptech.swipe; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> { private LayoutInflater inflater; private ArrayList<Model> imageModelArrayList; public Adapter(Context ctx, ArrayList<Model> imageModelArrayList){ inflater = LayoutInflater.from(ctx); this.imageModelArrayList = imageModelArrayList; } public void removeItem(int position) { imageModelArrayList.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, imageModelArrayList.size()); } public void restoreItem(Model model, int position) { imageModelArrayList.add(position, model); // notify item added by position notifyItemInserted(position); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.rv_item, parent, false); MyViewHolder holder = new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.time.setText(imageModelArrayList.get(position).getName()); } @Override public int getItemCount() { return imageModelArrayList.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ TextView time; public MyViewHolder(View itemView) { super(itemView); time = (TextView) itemView.findViewById(R.id.tv); } } }
- After Open MainActivity.java and modify the code as below.
package com.wapptech.swipe; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.View; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private ArrayList<Model> imageModelArrayList; private Adapter adapter; private Paint p = new Paint(); private String[] myImageNameList = new String[]{"Code1", "Code2", "Code3","Code4" ,"Code5","Code6", "Code7","Code8", "Code9","Code10"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recycler); imageModelArrayList = populateList(); adapter = new Adapter(this,imageModelArrayList); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false)); enableSwipe(); } private void enableSwipe(){ ItemTouchHelper.SimpleCallback simpleItemTouchCallback = 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) { int position = viewHolder.getAdapterPosition(); if (direction == ItemTouchHelper.LEFT){ final Model deletedModel = imageModelArrayList.get(position); final int deletedPosition = position; adapter.removeItem(position); // showing snack bar with Undo option Snackbar snackbar = Snackbar.make(getWindow().getDecorView().getRootView(), " removed from Recyclerview!", Snackbar.LENGTH_LONG); snackbar.setAction("UNDO", new View.OnClickListener() { @Override public void onClick(View view) { // undo is selected, restore the deleted item adapter.restoreItem(deletedModel, deletedPosition); } }); snackbar.setActionTextColor(Color.YELLOW); snackbar.show(); } else { final Model deletedModel = imageModelArrayList.get(position); final int deletedPosition = position; adapter.removeItem(position); // showing snack bar with Undo option Snackbar snackbar = Snackbar.make(getWindow().getDecorView().getRootView(), " removed from Recyclerview!", Snackbar.LENGTH_LONG); snackbar.setAction("UNDO", new View.OnClickListener() { @Override public void onClick(View view) { // undo is selected, restore the deleted item adapter.restoreItem(deletedModel, deletedPosition); } }); snackbar.setActionTextColor(Color.YELLOW); snackbar.show(); } } @Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { Bitmap icon; if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){ View itemView = viewHolder.itemView; float height = (float) itemView.getBottom() - (float) itemView.getTop(); float width = height / 3; if(dX > 0){ p.setColor(Color.parseColor("#388E3C")); RectF background = new RectF((float) itemView.getLeft(), (float) itemView.getTop(), dX,(float) itemView.getBottom()); c.drawRect(background,p); icon = BitmapFactory.decodeResource(getResources(), R.drawable.delete); RectF icon_dest = new RectF((float) itemView.getLeft() + width ,(float) itemView.getTop() + width,(float) itemView.getLeft()+ 2*width,(float)itemView.getBottom() - width); c.drawBitmap(icon,null,icon_dest,p); } else { p.setColor(Color.parseColor("#D32F2F")); RectF background = new RectF((float) itemView.getRight() + dX, (float) itemView.getTop(),(float) itemView.getRight(), (float) itemView.getBottom()); c.drawRect(background,p); icon = BitmapFactory.decodeResource(getResources(), R.drawable.delete); RectF icon_dest = new RectF((float) itemView.getRight() - 2*width ,(float) itemView.getTop() + width,(float) itemView.getRight() - width,(float)itemView.getBottom() - width); c.drawBitmap(icon,null,icon_dest,p); } } super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); } }; ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); itemTouchHelper.attachToRecyclerView(recyclerView); } private ArrayList<Model> populateList(){ ArrayList<Model> list = new ArrayList<>(); for(int i = 0; i < 8; i++){ Model imageModel = new Model(); imageModel.setName(myImageNameList[i]); list.add(imageModel); } return list; } }
Done Swipe left to right and right to left delete recyclerview and undo view.
Github: https://github.com/Sudarshan101/AndroidSwipeleftright.git
Youtube: https://www.youtube.com/watch?v=jLPB8R9W_pU
Thankyou