How can I detect from event and view that which item was swiped on, so I can delete the specific record from the arrayList and remove it from there followed by an update to the adapter?
ArrayList<User> users = ... // list of user records
adapter = new ListAdapter(getActivity(), users);
ListView listView = getView().findViewById(R.id.listView);
listView.setAdapter(adapter);
listView.setOnTouchListener((view, event) -> { // for deletion
return false;
});
Once deleted, adapter to be refreshed.
adapter.notifyDataSetChanged();
Edit
private class ListAdapter extends ArrayAdapter<User> {
public ListAdapter(Context context, ArrayList<User> users) {
super(context, 0, users);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup container) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, container, false);
}
((TextView) convertView.findViewById(android.R.id.text1)).setText(getItem(position).toString());
return convertView;
}
}
Edit 2
Following discussion, here's what my code looks like, looking forward to progress from this point onwards.
private class UserAdapter extends ArrayAdapter<User> {
public UserAdapter(Context context, ArrayList<User> users) {
super(context, 0, users);
}
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup container) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, container, false);
}
((TextView) convertView.findViewById(android.R.id.text1)).setText(getItem(position).toString());
GestureDetector gestureDetector = new GestureDetector(this.getContext(), new GestureListener());
convertView.setOnTouchListener(((view, event) -> {
return gestureDetector.onTouchEvent(event);
}));
return convertView;
}
}
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_DISTANCE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
Log.d("abc", "onSingleTapUp: ");
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityy) {
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (distanceX > 0)
Log.d("abc", "onFling: swipe right");
else
Log.d("abc", "onFling: swipe left");
return true;
}
return false;
}
}
Edit 3
private class UserAdapter extends ArrayAdapter<User> {
public UserAdapter(Context context, ArrayList<User> users) {
super(context, 0, users);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup container) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, container, false);
}
((TextView) convertView.findViewById(android.R.id.text1)).setText(getItem(position).toString());
MyGestureDetector gestureDetector = new MyGestureDetector(this.getContext(), new GestureListener());
convertView.setOnTouchListener(((view, event) -> gestureDetector.onTouchEvent(event)));
return convertView;
}
}
private class MyGestureDetector extends GestureDetector {
public MyGestureDetector(Context context, OnGestureListener listener) {
super(context, listener);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
}
}