how to implement both ontouch and also onfling in a same listview?
31,660
Pseudo code answer to clarify the above comments. How to have the MySimpleGestureListener's onTouch method called.
public class GestureExample extends Activity {
protected MyGestureListener myGestureListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myGestureListener = new MyGestureListener(this);
// or if you have already created a Gesture Detector.
// myGestureListener = new MyGestureListener(this, getExistingGestureDetector());
// Example of setting listener. The onTouchEvent will now be called on your listener
((ListView)findViewById(R.id.ListView)).setOnTouchListener(myGestureListener);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// or implement in activity or component. When your not assigning to a child component.
return myGestureListener.getDetector().onTouchEvent(event);
}
class MyGestureListener extends SimpleOnGestureListener implements OnTouchListener
{
Context context;
GestureDetector gDetector;
public MyGestureListener()
{
super();
}
public MyGestureListener(Context context) {
this(context, null);
}
public MyGestureListener(Context context, GestureDetector gDetector) {
if(gDetector == null)
gDetector = new GestureDetector(context, this);
this.context = context;
this.gDetector = gDetector;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return super.onFling(e1, e2, velocityX, velocityY);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return super.onSingleTapConfirmed(e);
}
public boolean onTouch(View v, MotionEvent event) {
// Within the MyGestureListener class you can now manage the event.getAction() codes.
// Note that we are now calling the gesture Detectors onTouchEvent. And given we've set this class as the GestureDetectors listener
// the onFling, onSingleTap etc methods will be executed.
return gDetector.onTouchEvent(event);
}
public GestureDetector getDetector()
{
return gDetector;
}
}
}
Comments
-
Ads over 4 years
i have a listview and implemented onclick and also onfling.problem is when i do fling(swipe left to right), onclick event of listview is also getting executed.How to overCome this problem? how to differentiate touch(tap) and fling(swipe) in listview?
listClickListener = new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v,int position, long id) { //Job of Onclick Listener } }; mContactList.setOnItemClickListener(listClickListener); mContactList.setAdapter(adapter); // Gesture detection gestureDetector = new GestureDetector(new MyGestureDetector(prosNos)); gestureListener = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return true; } return false; } }; mContactList.setOnTouchListener(gestureListener); } public class MyGestureDetector extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // My fling event return false; } }
P.S. Is it possible? to comment the OnClickListener of ListView and writing the same logic in any onTouchEvent? but still I have no doubt that onFling will call onTouch. Am I right?
-
Emile over 13 yearsNote, That whilst this clarifies the onTouch events, it doesn't strictly answer the issue of the tap event being fired on the list view. I think the issue may lie in your onFling code. You need to ensure that you return true when you happy you've detected a sufficient fling for you needs. That way you capture the event and stop other methods/detections from being interpreted.
-
Ads over 13 yearsYou found the exact problem of mine...Very sorry i forgot to return true when the event is executed
-
Ads over 13 yearsin emulator onfling method is working fine.But in device it is not working? i hope gesture is not recognized by the device. how to make that work?
-
kkudi over 13 yearsI just wanted to say that this worked for me only when I returned true in onDown().