Android Swipe listed

Does anyone have a simple ListActivity example that displays Textviews in a column, and when you scroll left-right, do you see this line in a new view? This would have to edit the data for this row or show more detailed information about this row. Please do not link to the code shogun or other sites, as I have googled and I have not seen this answer.

+47
android list textview listactivity swipe
Dec 07 '10 at 4:45
source share
4 answers

I had the same problem and did not find my answer here.

I wanted to detect the swipe action in the ListView element and mark it as swiped, and continue to support OnItemClick and OnItemLongClick.

Here is the solution:

1 SwipeDetector Class:

import android.util.Log; import android.view.MotionEvent; import android.view.View; public class SwipeDetector implements View.OnTouchListener { public static enum Action { LR, // Left to Right RL, // Right to Left TB, // Top to bottom BT, // Bottom to Top None // when no action was detected } private static final String logTag = "SwipeDetector"; private static final int MIN_DISTANCE = 100; private float downX, downY, upX, upY; private Action mSwipeDetected = Action.None; public boolean swipeDetected() { return mSwipeDetected != Action.None; } public Action getAction() { return mSwipeDetected; } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); downY = event.getY(); mSwipeDetected = Action.None; return false; // allow other events like Click to be processed case MotionEvent.ACTION_UP: upX = event.getX(); upY = event.getY(); float deltaX = downX - upX; float deltaY = downY - upY; // horizontal swipe detection if (Math.abs(deltaX) > MIN_DISTANCE) { // left or right if (deltaX < 0) { Log.i(logTag, "Swipe Left to Right"); mSwipeDetected = Action.LR; return false; } if (deltaX > 0) { Log.i(logTag, "Swipe Right to Left"); mSwipeDetected = Action.RL; return false; } } else if (Math.abs(deltaY) > MIN_DISTANCE) { // vertical swipe // detection // top or down if (deltaY < 0) { Log.i(logTag, "Swipe Top to Bottom"); mSwipeDetected = Action.TB; return false; } if (deltaY > 0) { Log.i(logTag, "Swipe Bottom to Top"); mSwipeDetected = Action.BT; return false; } } return false; } return false; } } 

2nd I use the swipe sensor class as a list:

  final ListView lv = getListView(); final SwipeDetector swipeDetector = new SwipeDetector(); lv.setOnTouchListener(swipeDetector); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (swipeDetector.swipeDetected()){ // do the onSwipe action } else { // do the onItemClick action } } }); lv.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) { if (swipeDetector.swipeDetected()){ // do the onSwipe action } else { // do the onItemLongClick action } } }); 

Thus, I can support 3 actions - swipe the click, click on the long click, and I can use the information about the ListView element.

ADDED LATER:

Since the ListView catches the scroll action, it is sometimes difficult to scroll. To fix this, I made the following change to SwipeDetector.onTouch:

 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { downX = event.getX(); downY = event.getY(); mSwipeDetected = Action.None; return false; // allow other events like Click to be processed } case MotionEvent.ACTION_MOVE: { upX = event.getX(); upY = event.getY(); float deltaX = downX - upX; float deltaY = downY - upY; // horizontal swipe detection if (Math.abs(deltaX) > HORIZONTAL_MIN_DISTANCE) { // left or right if (deltaX < 0) { Log.i(logTag, "Swipe Left to Right"); mSwipeDetected = Action.LR; return true; } if (deltaX > 0) { Log.i(logTag, "Swipe Right to Left"); mSwipeDetected = Action.RL; return true; } } else // vertical swipe detection if (Math.abs(deltaY) > VERTICAL_MIN_DISTANCE) { // top or down if (deltaY < 0) { Log.i(logTag, "Swipe Top to Bottom"); mSwipeDetected = Action.TB; return false; } if (deltaY > 0) { Log.i(logTag, "Swipe Bottom to Top"); mSwipeDetected = Action.BT; return false; } } return true; } } return false; } 
+115
Feb 18 2018-12-18T00:
source share

here is a snippet that I use to detect swipes. Then you can use viewflipper to change the view.

  @Override public boolean onTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return true; } else { return false; } } private static final int SWIPE_MIN_DISTANCE = 30; private static final int SWIPE_MAX_OFF_PATH = 250; private static final int SWIPE_THRESHOLD_VELOCITY = 200; class MyGestureDetector extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { leftFling(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { rightFling(); } } catch (Exception e) { // nothing } return false; } } 
+1
May 04 '11 at 11:50
source share

Here is a very simplified version using two listeners (onTouch to detect swipe and onClickIem to detect click of an element) using the isSwipe flag to stop onClickItemListener until it is confirmed that it was not scrolling

Click detection
Whereas this is not a napkin first

  listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { if(!isSwipe) { adapter.increase(arg2); adapter.notifyDataSetChanged(); } } }); 

Scroll detection

  listView.setOnTouchListener(new OnTouchListener() { private int action_down_x = 0; private int action_up_x = 0; private int difference = 0; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: action_down_x = (int) event.getX(); isSwipe=false; //until now break; case MotionEvent.ACTION_MOVE: if(!isSwipe) { action_up_x = (int) event.getX(); difference = action_down_x - action_up_x; if(Math.abs(difference)>50) { Log.d("action","action down x: "+action_down_x); Log.d("action","action up x: "+action_up_x); Log.d("action","difference: "+difference); //swipe left or right if(difference>0){ //swipe left Log.d("action","swipe left"); adapter.decrease(selectedItem); adapter.notifyDataSetChanged(); } else{ //swipe right Log.d("action","swipe right"); } isSwipe=true; } } break; case MotionEvent.ACTION_UP: Log.d("action", "ACTION_UP - "); action_down_x = 0; action_up_x = 0; difference = 0; break; } return false; //to allow the clicklistener to work after } }) 
+1
Jun 17 '14 at 14:13
source share

If you want to display some action buttons when a list item scrolls, there are many libraries on the Internet that have this behavior. I implemented a library that I found on the Internet and I am very satisfied. It is very easy to use and very fast. I improved the source library and I added a new click for the click element. I also added the awesome library font ( http://fortawesome.imtqy.com/Font-Awesome/ ), and now you can simply add a new element title and specify the name of the icon from the awesome font.

Here is the github link

0
Jan 24 '15 at 14:34
source share



All Articles