OnFling in a ListView, Get the swiped Item info
Asked Answered
E

3

8

I'd like to have in my app the same behaviour of native contacts app. Specifically I'd like to implement the swipe right for call and the swipe left for the textmsg. I've a ListView, I setted the arrayAdapter and i'va implemented the gesture detector for the onFlingMethod. I correctly intercept the swipe side and i can lauch the Call app. I need to put the item number (and other info) to the Intent, so I need to get the swiped item. Here my code.

public class Contacts extends Activity implements OnGestureListener {

    private static final String TAG = "[Contacts]";
    ArrayList < ContactInfo > mData;

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

    /** Called when the activity is first created. */
    private GestureDetector detector = new GestureDetector(this);
    Button btnContacts;
    Button btnProfile;
    Button btnSettings;
    ImageButton btnStatus;
    HandleServer cubeServer;
    Button slideHandleButton;
    SlidingDrawer slidingDrawer;
    String filter = "n";
    ArrayAdapter < ContactInfo > adapter;
    ListView listView;


    public boolean onCreateOptionsMenu(Menu menu) {

        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        return true;
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contact);

        listView = (ListView) findViewById(R.id.arrayList);
        listView.setCacheColorHint(R.color.white);

        mData = getContact();

        adapter = new ArrayAdapter < ContactInfo > (this.getApplicationContext(), R.layout.row, R.id.nome, mData) {
            public View getView(final int position, View convertView, ViewGroup parent) {
                ViewHolder viewHolder = null;
                if (convertView == null) {

                    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView = inflater.inflate(R.layout.row, null);
                    viewHolder = new ViewHolder();
                    final ContactInfo item = getItem(position);

                    viewHolder.name.setText(item.getName());


                    convertView.setClickable(true);

                    OnClickListener myClickListener = new OnClickListener() {

                        public void onClick(View v) {
                            Intent intent = new Intent(v.getContext(), ContactTabs.class);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            //Log.i(TAG,"id value:"+item.getId());
                            intent.putExtra("id", item.getId());
                            intent.putExtra("name", item.getName());
                            //aggiungi quello che serve per gli extra ed i task
                            intent.putExtra("calendar", item.getCalendarDraw());
                            intent.putExtra("gmail", item.getGmailDraw());
                            intent.putExtra("operator", item.getOperatorDraw());
                            intent.putExtra("imgStatus", item.getImgStatusDraw());
                            startActivity(intent);
                        }
                    };

                    convertView.setOnClickListener(myClickListener);

                    convertView.setOnTouchListener(new OnTouchListener() {

                        public boolean onTouch(View view, MotionEvent e) {
                            detector.onTouchEvent(e);
                            return false;
                        }
                    });

                    return convertView;
                }
            };

            listView.setAdapter(adapter);
        }

        public boolean onDown(MotionEvent e) {
            // TODO Auto-generated method stub
            return false;
        }

        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) {
                    //CallNativeApp cna = new CallNativeApp(getApplicationContext());
                    //cna.sendSms("11111", "");
                    Toast.makeText(getApplicationContext(), "Left Swipe", Toast.LENGTH_SHORT).show();
                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    //CallNativeApp cna = new CallNativeApp(getApplicationContext());
                    //cna.call("1111");

                    Toast.makeText(getApplicationContext(), "Right Swipe", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                // nothing
            }

            return true;
        }
        public void onLongPress(MotionEvent e) {
            // TODO Auto-generated method stub

        }
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
            // TODO Auto-generated method stub
            return true;
        }
        public void onShowPress(MotionEvent e) {
            // TODO Auto-generated method stub

        }
        public boolean onSingleTapUp(MotionEvent e) {
            // TODO Auto-generated method stub
            return true;
        }

    }
}
Emersion answered 27/5, 2011 at 10:56 Comment(1)
whats the problem u r facing here?? is that working as expected?Mackenzie
E
7

I solve this issue with ListView.pointToPosition() method.

Here my fragment of code:

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
    float velocityX, float velocityY) {

    if (e2.getX() - e1.getX() > MOVE) {

        int id = list.pointToPosition((int) e1.getX(), (int) e1.getY());
        Reminder temp = (Reminder) adapter.getItem((id));
        return true;
    }

    return false;
}

First, you get the rowID from list.pointToPosition((int) e1.getX(), (int) e1.getY()); and do with it anything you want. In my case Reminder is the type of objects in my custom array adapter for list.

Eloquence answered 21/8, 2012 at 11:32 Comment(0)
B
0

I would assume the way to do it would be to add the GestureListener to the row, as you do with the OnClickListener, instead of the main activity.

If you have a large list, that would mean a lot of GestureListeners and might affect performance. In that case you might be better off calculating what view has been swiped using the swipe position and the views.

Bausch answered 26/6, 2012 at 13:1 Comment(0)
D
0

Finally i got solution get index when swipe on left or right on List View.... @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                         int id = list.pointToPosition((int) e1.getX(), (int) e1.getY());
                          task = (TaskClass) adapter.getItem((id));
                         Log.e("Result", "Result..."+task.toString());
                        onSwipeRight(task.milestonetask);
                    } else {
                         int id = list.pointToPosition((int) e1.getX(), (int) e1.getY());
                          task = (TaskClass) adapter.getItem((id));
                        onSwipeLeft(task.milestonetask);
                    }
                }
            } else {
                if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        onSwipeBottom();
                    } else {
                        onSwipeTop();
                    }
                }
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return result;
    }
Disown answered 1/2, 2014 at 8:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.