Will my cards not always be fired when they are deleted left or right?

I use FrameLayout to swipe gestures for each of my cards, but the cards do not always quit. And sometimes they just hang on the left or right until the user draws a map a second time.

How can i fix this?

MyFrameLayout:

 public class MyFrameLayout extends FrameLayout { private static int mWidth = 200; MyFrameLayout touchFrameLayout; // Constructors // i call "initialize(context)" in all of them private void initialize(Context context) { setOnTouchListener(mTouchListener); touchFrameLayout = this; } private float mDisplacementX; private float mDisplacementY; private float mInitialTx; private boolean mTracking; private OnTouchListener mTouchListener = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mWidth = (int) touchFrameLayout.getLayoutParams().width; switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: mDisplacementX = event.getRawX(); mDisplacementY = event.getRawY(); mInitialTx = getTranslationX(); return true; case MotionEvent.ACTION_MOVE: // get the delta distance in X and Y direction float deltaX = event.getRawX() - mDisplacementX; float deltaY = event.getRawY() - mDisplacementY; // updatePressedState(false); // set the touch and cancel event if ((Math.abs(deltaX) > ViewConfiguration.get(getContext()) .getScaledTouchSlop() * 2 && Math.abs(deltaY) < Math .abs(deltaX) / 2) || mTracking) { mTracking = true; if (getTranslationX() <= mWidth / 2 && getTranslationX() >= -(mWidth / 2)) { setTranslationX(mInitialTx + deltaX); return true; } } break; case MotionEvent.ACTION_UP: if (mTracking) { mTracking = false; float currentTranslateX = getTranslationX(); if (currentTranslateX > (mWidth/10)) { rightSwipe(); } else if (currentTranslateX < -(mWidth*10)) { leftSwipe(); } // comment this line if you don't want your frame layout to // take its original position after releasing the touch setTranslationX(0); return true; } else { // handle click event setTranslationX(0); } break; } return false; } }; private void rightSwipe() { Toast.makeText(this.getContext(), "Swipe to the right", Toast.LENGTH_SHORT).show(); DeleteCard(); } private void leftSwipe() { Toast.makeText(this.getContext(), "Swipe to the left", Toast.LENGTH_SHORT).show(); DeleteCard(); } } 

Xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.testing.android.layout.MyFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/taskViewContainer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" app:cardElevation="8dp" app:cardPreventCornerOverlap="false" card_view:cardCornerRadius="8dp"> </android.support.v7.widget.CardView> </com.example.testing.android.layout.MyFrameLayout> </RelativeLayout> 
+5
source share
1 answer

I adapted the romannurik Android-SwipeToDismiss to do just that.

The code is on github with a woking example application and consists of:

A subclass of RecyclerView.OnItemTouchListener that listens to the touch of events and detects when an item scrolls, animating it accordingly. SwipeListener, which is called in order to find out if the element can be fired and called again when the elements are fired. To use it, copy the SwipeableRecyclerViewTouchListener class into your project and use it as follows

 mAdapter = new CardViewAdapter(mItems); mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAdapter(mAdapter); SwipeableRecyclerViewTouchListener swipeTouchListener = new SwipeableRecyclerViewTouchListener(mRecyclerView, new SwipeableRecyclerViewTouchListener.SwipeListener() { @Override public boolean canSwipe(int position) { return true; } @Override public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) { for (int position : reverseSortedPositions) { mItems.remove(position); mAdapter.notifyItemRemoved(position); } mAdapter.notifyDataSetChanged(); } @Override public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) { for (int position : reverseSortedPositions) { mItems.remove(position); mAdapter.notifyItemRemoved(position); } mAdapter.notifyDataSetChanged(); } }); mRecyclerView.addOnItemTouchListener(swipeTouchListener); } 

It may also be useful: http://www.getgoodcode.com/2013/06/swipe-to-dismiss-google-style/

Hope this works for you!

0
source

Source: https://habr.com/ru/post/1214564/


All Articles