How To Use Swipedismissbehavior.ondismisslistener On Recyclerview
I am trying to use the SwipeDismissBehavoir from design support library. I've list items in RecyclerView and swiping an item have to dismiss (like google inbox app) . I've set the
Solution 1:
Here is example how delete row by swipe
MainActivity.java
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
finalRecyclerViewrecyclerView= (RecyclerView)findViewById(R.id.recyclerView);
// init layout manager
RecyclerView.LayoutManagerlayoutManager=newLinearLayoutManager(this);
final ArrayList<String> list = newArrayList<String>();
list.add("Item1");
list.add("Item2");
list.add("Item3");
list.add("Item4");
list.add("Item5");
list.add("Item6");
finalMyAdapteradapter=newMyAdapter(list);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
ItemTouchHelperswipeToDismissTouchHelper=newItemTouchHelper(newItemTouchHelper.SimpleCallback(
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@OverridepublicbooleanonMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
// callback for drag-n-drop, false to skip this featurereturnfalse;
}
@OverridepublicvoidonSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// callback for swipe to dismiss, removing item from data and adapter
list.remove(viewHolder.getAdapterPosition());
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
});
swipeToDismissTouchHelper.attachToRecyclerView(recyclerView);
}
Adapter
publicclassMyAdapterextendsRecyclerView.Adapter<MyAdapter.MyViewHolder> {
ArrayList<String> dataset_;
publicstaticclassMyViewHolderextendsRecyclerView.ViewHolder{
public Button mBtn;
public TextView mTextView2;
publicMyViewHolder(View v){
super(v);
mBtn = (Button) itemView.findViewById(R.id.delete);
mTextView2 = (TextView) itemView.findViewById(R.id.textView2);
}
}
publicMyAdapter(ArrayList<String> dataset){
dataset_ = dataset;
}
@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
Viewv= LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view,parent,false);
MyViewHoldermyViewHolder=newMyViewHolder(v);
return myViewHolder;
}
@OverridepublicvoidonBindViewHolder(MyViewHolder holder,int position){
holder.mTextView2.setText(dataset_.get(position));
}
@OverridepublicintgetItemCount(){
return dataset_.size();
}
}
Layout
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:baselineAligned="false"android:orientation="vertical"android:padding="16dp"><TextViewstyle="?android:listSeparatorTextViewStyle"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/heading_dismissable_recycler_view" /><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>
Item in RecyclerView
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textAppearance="?android:attr/textAppearanceMedium"android:text="Medium Text"android:id="@+id/textView2"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/delete"android:text="Delete"android:layout_marginLeft="150dp"android:visibility="invisible" /></LinearLayout></LinearLayout>
Solution 2:
Tried with single view. I can know the view was dismissed, but I'm wondering how to restore the view like Gmail.
Baca Juga
Layout:
<android.support.design.widget.CoordinatorLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/coordinatorLayout"tools:context=".MainActivity"><android.support.v7.widget.CardViewandroid:id="@+id/cardView"android:layout_margin="20dp"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:text="Haha"android:layout_width="match_parent"android:layout_height="wrap_content"/></android.support.v7.widget.CardView></android.support.design.widget.CoordinatorLayout>
Activity:
publicclassMainActivityextendsAppCompatActivity {
private CoordinatorLayout coordinatorLayout;
private CardView cardView;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinatorLayout);
cardView = (CardView) findViewById(R.id.cardView);
CoordinatorLayout.LayoutParamsparams= (CoordinatorLayout.LayoutParams) cardView.getLayoutParams();
final SwipeDismissBehavior<CardView> behavior = newSwipeDismissBehavior();
behavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_START_TO_END);
behavior.setListener(newSwipeDismissBehavior.OnDismissListener() {
@OverridepublicvoidonDismiss(final View view) {
Snackbar.make(coordinatorLayout, "Done", Snackbar.LENGTH_LONG)
.show();
}
@OverridepublicvoidonDragStateChanged(int i) {
}
});
params.setBehavior(behavior);
cardView.setOnTouchListener(newView.OnTouchListener() {
@OverridepublicbooleanonTouch(View v, MotionEvent event) {
return behavior.onTouchEvent(coordinatorLayout, cardView, event);
}
});
}
}
Solution 3:
I have succeeded implementing the support library SwipeDismissBehavior and it actually requires CoordinatorLayout inside of each inflated card view layout. I haven't noticed any performance issues so far, so I assume CoordinatorLayout is not so heavy for the UI. There is probably a better way, but I still haven't found it.
<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayoutxmlns: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="wrap_content"android:background="#FF0000"><LinearLayoutandroid:id="@+id/card_content_layout"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:background="#FFFFFF"android:padding="20dp"><TextViewandroid:id="@+id/card_context_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Test text"/></LinearLayout></android.support.design.widget.CoordinatorLayout>
In the constructor of the RecyclerView.ViewHolder implementation class (which is inside the Adapter) I have added:
ViewcardContentLayout= view.findViewById(R.id.card_content_layout);
SwipeDismissBehavior<View> swipeDismissBehavior = newSwipeDismissBehavior<>();
swipeDismissBehavior.setSwipeDirection(SwipeDismissBehavior.SWIPE_DIRECTION_END_TO_START);
swipeDismissBehavior.setListener(newSwipeDismissBehavior.OnDismissListener() {
@OverridepublicvoidonDismiss(View view) {
intadapterPosition= getAdapterPosition();
deleteListener.onDismissGesture(view, adapterPosition);
}
@OverridepublicvoidonDragStateChanged(int state) { }
});
CoordinatorLayout.LayoutParamscoordinatorParams= (CoordinatorLayout.LayoutParams) cardContentLayout.getLayoutParams();
coordinatorParams.setBehavior(swipeDismissBehavior);
cardContentLayout.setOnTouchListener(newView.OnTouchListener() {
@OverridepublicbooleanonTouch(View v, MotionEvent event) {
return swipeDismissBehavior.onTouchEvent((CoordinatorLayout) itemView, cardContentLayout, event);
}
});
Post a Comment for "How To Use Swipedismissbehavior.ondismisslistener On Recyclerview"