Hello Friends, Here I am sharing a code to perform delete operation on listview by just swiping it to right or left.
activity_main.xml:
SwipeDismissTouchListener:
MainActivity:
you may like list view delete row item Click here
More Ref:
http://iamvijayakumar.blogspot.in/2013/09/remove-and-undo-listview-item-with.html
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="horizontal"
android:padding="16dp" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >
<TextView
style="?android:listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ListView" />
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
SwipeDismissListViewTouchListener:
import
android.graphics.Rect;
import
android.view.MotionEvent;
import
android.view.VelocityTracker;
import android.view.View;
import
android.view.ViewConfiguration;
import
android.view.ViewGroup;
import
android.widget.AbsListView;
import
android.widget.ListView;
import
com.nineoldandroids.animation.Animator;
import
com.nineoldandroids.animation.AnimatorListenerAdapter;
import com.nineoldandroids.animation.ValueAnimator;
import java.util.ArrayList;
import
java.util.Collections;
import java.util.List;
import static
com.nineoldandroids.view.ViewHelper.setAlpha;
import static
com.nineoldandroids.view.ViewHelper.setTranslationX;
import static
com.nineoldandroids.view.ViewPropertyAnimator.animate;
public class
SwipeDismissListViewTouchListener implements View.OnTouchListener
{
private int mSlop;
private int mMinFlingVelocity;
private int mMaxFlingVelocity;
private long mAnimationTime;
//
Fixed properties
private ListView mListView;
private OnDismissCallback mCallback;
private int mViewWidth = 1; // 1 and not 0 to
prevent dividing by zero
//
Transient properties
private
List<PendingDismissData> mPendingDismisses = new ArrayList<PendingDismissData>();
private int mDismissAnimationRefCount = 0;
private float mDownX;
private boolean mSwiping;
private VelocityTracker mVelocityTracker;
private int mDownPosition;
private View mDownView;
private boolean mPaused;
public interface OnDismissCallback {
void onDismiss(ListView
listView, int[] reverseSortedPositions);
}
public
SwipeDismissListViewTouchListener(ListView listView, OnDismissCallback callback)
{
ViewConfiguration vc = ViewConfiguration.get(listView.getContext());
mSlop =
vc.getScaledTouchSlop();
mMinFlingVelocity =
vc.getScaledMinimumFlingVelocity();
mMaxFlingVelocity =
vc.getScaledMaximumFlingVelocity();
mAnimationTime =
listView.getContext().getResources().getInteger(
android.R.integer.config_shortAnimTime);
mListView = listView;
mCallback = callback;
}
public void setEnabled(boolean enabled) {
mPaused = !enabled;
}
public
AbsListView.OnScrollListener makeScrollListener() {
return new
AbsListView.OnScrollListener() {
@Override
public void
onScrollStateChanged(AbsListView absListView, int scrollState) {
setEnabled(scrollState !=
AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);
}
@Override
public void onScroll(AbsListView
absListView, int i, int i1, int i2) {
}
};
}
@Override
public boolean onTouch(View view,
MotionEvent motionEvent) {
if (mViewWidth < 2) {
mViewWidth = mListView.getWidth();
}
switch
(motionEvent.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
if (mPaused) {
return false;
}
// Find the child view that was
touched (perform a hit test)
Rect rect = new Rect();
int childCount = mListView.getChildCount();
int[] listViewCoords = new int[2];
mListView.getLocationOnScreen(listViewCoords);
int x = (int)
motionEvent.getRawX() - listViewCoords[0];
int y = (int)
motionEvent.getRawY() - listViewCoords[1];
View child;
for (int i = 0; i <
childCount; i++) {
child = mListView.getChildAt(i);
child.getHitRect(rect);
if (rect.contains(x,
y)) {
mDownView = child;
break;
}
}
if (mDownView != null) {
mDownX =
motionEvent.getRawX();
mDownPosition = mListView.getPositionForView(mDownView);
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(motionEvent);
}
view.onTouchEvent(motionEvent);
return true;
}
case MotionEvent.ACTION_UP: {
if (mVelocityTracker == null) {
break;
}
float deltaX =
motionEvent.getRawX() - mDownX;
mVelocityTracker.addMovement(motionEvent);
mVelocityTracker.computeCurrentVelocity(1000);
float velocityX = Math.abs(mVelocityTracker.getXVelocity());
float velocityY = Math.abs(mVelocityTracker.getYVelocity());
boolean dismiss = false;
boolean dismissRight = false;
if (Math.abs(deltaX)
> mViewWidth / 2) {
dismiss = true;
dismissRight = deltaX >
0;
} else if (mMinFlingVelocity <= velocityX
&& velocityX <= mMaxFlingVelocity
&& velocityY
< velocityX) {
dismiss = true;
dismissRight = mVelocityTracker.getXVelocity() >
0;
}
if (dismiss) {
// dismiss
final View downView = mDownView; // mDownView gets
null'd before animation ends
final int downPosition = mDownPosition;
++mDismissAnimationRefCount;
animate(mDownView)
.translationX(dismissRight ? mViewWidth : -mViewWidth)
.alpha(0)
.setDuration(mAnimationTime)
.setListener(new
AnimatorListenerAdapter() {
@Override
public void
onAnimationEnd(Animator animation) {
performDismiss(downView, downPosition);
}
});
} else {
// cancel
animate(mDownView)
.translationX(0)
.alpha(1)
.setDuration(mAnimationTime)
.setListener(null);
}
mVelocityTracker = null;
mDownX = 0;
mDownView = null;
mDownPosition = ListView.INVALID_POSITION;
mSwiping = false;
break;
}
case MotionEvent.ACTION_MOVE: {
if (mVelocityTracker == null || mPaused) {
break;
}
mVelocityTracker.addMovement(motionEvent);
float deltaX =
motionEvent.getRawX() - mDownX;
if (Math.abs(deltaX)
> mSlop) {
mSwiping = true;
mListView.requestDisallowInterceptTouchEvent(true);
// Cancel
ListView's touch (un-highlighting the item)
MotionEvent cancelEvent =
MotionEvent.obtain(motionEvent);
cancelEvent.setAction(MotionEvent.ACTION_CANCEL |
(motionEvent.getActionIndex()
<<
MotionEvent.ACTION_POINTER_INDEX_SHIFT));
mListView.onTouchEvent(cancelEvent);
}
if (mSwiping) {
setTranslationX(mDownView, deltaX);
setAlpha(mDownView, Math.max(0f,
Math.min(1f,
1f - 2f * Math.abs(deltaX)
/ mViewWidth)));
return true;
}
break;
}
}
return false;
}
class PendingDismissData implements
Comparable<PendingDismissData> {
public int position;
public View view;
public PendingDismissData(int position, View view)
{
this.position = position;
this.view = view;
}
@Override
public int
compareTo(PendingDismissData other) {
// Sort by descending position
return other.position - position;
}
}
private void performDismiss(final View dismissView, final int dismissPosition) {
//
Animate the dismissed list item to zero-height and fire the dismiss callback
when
//
all dismissed list item animations have completed. This triggers layout on each
animation
//
frame; in the future we may want to do something smarter and more performant.
final
ViewGroup.LayoutParams lp = dismissView.getLayoutParams();
final int originalHeight =
dismissView.getHeight();
ValueAnimator animator = ValueAnimator.ofInt(originalHeight,
1).setDuration(mAnimationTime);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void
onAnimationEnd(Animator animation) {
--mDismissAnimationRefCount;
if (mDismissAnimationRefCount == 0) {
// No active
animations, process all pending dismisses.
// Sort by
descending position
Collections.sort(mPendingDismisses);
int[] dismissPositions =
new int[mPendingDismisses.size()];
for (int i = mPendingDismisses.size() - 1; i >=
0; i--) {
dismissPositions[i] = mPendingDismisses.get(i).position;
}
mCallback.onDismiss(mListView, dismissPositions);
ViewGroup.LayoutParams lp;
for (PendingDismissData
pendingDismiss : mPendingDismisses) {
// Reset view
presentation
setAlpha(pendingDismiss.view, 1f);
setTranslationX(pendingDismiss.view, 0);
lp = pendingDismiss.view.getLayoutParams();
lp.height = originalHeight;
pendingDismiss.view.setLayoutParams(lp);
}
mPendingDismisses.clear();
}
}
});
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void
onAnimationUpdate(ValueAnimator valueAnimator) {
lp.height = (Integer)
valueAnimator.getAnimatedValue();
dismissView.setLayoutParams(lp);
}
});
mPendingDismisses.add(new
PendingDismissData(dismissPosition, dismissView));
animator.start();
}
}
import
android.view.MotionEvent;
import
android.view.VelocityTracker;
import android.view.View;
import
android.view.ViewConfiguration;
import
android.view.ViewGroup;
import
com.nineoldandroids.animation.Animator;
import
com.nineoldandroids.animation.AnimatorListenerAdapter;
import
com.nineoldandroids.animation.ValueAnimator;
import static
com.nineoldandroids.view.ViewHelper.setAlpha;
import static
com.nineoldandroids.view.ViewHelper.setTranslationX;
import static
com.nineoldandroids.view.ViewPropertyAnimator.animate;
public class
SwipeDismissTouchListener implements View.OnTouchListener {
//
Cached ViewConfiguration and system-wide constant values
private int mSlop;
private int mMinFlingVelocity;
private int mMaxFlingVelocity;
private long mAnimationTime;
//
Fixed properties
private View mView;
private OnDismissCallback mCallback;
private int mViewWidth = 1; // 1 and not 0 to
prevent dividing by zero
//
Transient properties
private float mDownX;
private boolean mSwiping;
private Object mToken;
private VelocityTracker mVelocityTracker;
private float mTranslationX;
public interface OnDismissCallback {
void onDismiss(View view,
Object token);
}
public
SwipeDismissTouchListener(View view, Object token, OnDismissCallback callback)
{
ViewConfiguration vc = ViewConfiguration.get(view.getContext());
mSlop =
vc.getScaledTouchSlop();
mMinFlingVelocity =
vc.getScaledMinimumFlingVelocity();
mMaxFlingVelocity =
vc.getScaledMaximumFlingVelocity();
mAnimationTime =
view.getContext().getResources().getInteger(
android.R.integer.config_shortAnimTime);
mView = view;
mToken = token;
mCallback = callback;
}
@Override
public boolean onTouch(View view,
MotionEvent motionEvent) {
//
offset because the view is translated during swipe
motionEvent.offsetLocation(mTranslationX, 0);
if (mViewWidth < 2) {
mViewWidth = mView.getWidth();
}
switch
(motionEvent.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
// TODO: ensure this is a
finger, and set a flag
mDownX = motionEvent.getRawX();
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(motionEvent);
view.onTouchEvent(motionEvent);
return false;
}
case MotionEvent.ACTION_UP: {
if (mVelocityTracker == null) {
break;
}
float deltaX =
motionEvent.getRawX() - mDownX;
mVelocityTracker.addMovement(motionEvent);
mVelocityTracker.computeCurrentVelocity(1000);
float velocityX = Math.abs(mVelocityTracker.getXVelocity());
float velocityY = Math.abs(mVelocityTracker.getYVelocity());
boolean dismiss = false;
boolean dismissRight = false;
if (Math.abs(deltaX)
> mViewWidth / 2) {
dismiss = true;
dismissRight = deltaX >
0;
} else if (mMinFlingVelocity <= velocityX
&& velocityX <= mMaxFlingVelocity
&& velocityY
< velocityX) {
dismiss = true;
dismissRight = mVelocityTracker.getXVelocity() >
0;
}
if (dismiss) {
// dismiss
animate(mView)
.translationX(dismissRight ? mViewWidth : -mViewWidth)
.alpha(0)
.setDuration(mAnimationTime)
.setListener(new
AnimatorListenerAdapter() {
@Override
public void
onAnimationEnd(Animator animation) {
performDismiss();
}
});
} else {
// cancel
animate(mView)
.translationX(0)
.alpha(1)
.setDuration(mAnimationTime)
.setListener(null);
}
mVelocityTracker = null;
mTranslationX = 0;
mDownX = 0;
mSwiping = false;
break;
}
case MotionEvent.ACTION_MOVE: {
if (mVelocityTracker == null) {
break;
}
mVelocityTracker.addMovement(motionEvent);
float deltaX =
motionEvent.getRawX() - mDownX;
if (Math.abs(deltaX)
> mSlop) {
mSwiping = true;
mView.getParent().requestDisallowInterceptTouchEvent(true);
// Cancel
listview's touch
MotionEvent cancelEvent =
MotionEvent.obtain(motionEvent);
cancelEvent.setAction(MotionEvent.ACTION_CANCEL |
(motionEvent.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
mView.onTouchEvent(cancelEvent);
}
if (mSwiping) {
mTranslationX = deltaX;
setTranslationX(mView, deltaX);
// TODO: use an ease-out interpolator
or such
setAlpha(mView, Math.max(0f,
Math.min(1f,
1f - 2f * Math.abs(deltaX)
/ mViewWidth)));
return true;
}
break;
}
}
return false;
}
private void performDismiss() {
//
Animate the dismissed view to zero-height and then fire the dismiss callback.
//
This triggers layout on each animation frame; in the future we may want to do
something
//
smarter and more performant.
final
ViewGroup.LayoutParams lp = mView.getLayoutParams();
final int originalHeight = mView.getHeight();
ValueAnimator animator =
ValueAnimator.ofInt(originalHeight, 1).setDuration(mAnimationTime);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void
onAnimationEnd(Animator animation) {
mCallback.onDismiss(mView, mToken);
// Reset view presentation
setAlpha(mView, 1f);
setTranslationX(mView, 0);
lp.height = originalHeight;
mView.setLayoutParams(lp);
}
});
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void
onAnimationUpdate(ValueAnimator valueAnimator) {
lp.height = (Integer)
valueAnimator.getAnimatedValue();
mView.setLayoutParams(lp);
}
});
animator.start();
}
}
import java.util.ArrayList;
import java.util.Arrays;
import
android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import
android.widget.ArrayAdapter;
import
android.widget.ListView;
import
android.widget.Toast;
public class MainActivity extends ListActivity
{
ArrayAdapter<String> mAdapter;
public void onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//
Set up ListView example
String[] items = new String[20];
for (int i = 0; i < items.length; i++)
{
items[i] = "Item " + (i + 1);
}
mAdapter = new
ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
new
ArrayList<String>(Arrays.asList(items)));
setListAdapter(mAdapter);
ListView listView = getListView();
//
Create a ListView-specific touch listener. ListViews are given special
treatment because
//
by default they handle touches for their list items... i.e. they're in charge
of drawing
//
the pressed state (the list selector), handling list item clicks, etc.
SwipeDismissListViewTouchListener touchListener =
new
SwipeDismissListViewTouchListener(
listView,
new
SwipeDismissListViewTouchListener.OnDismissCallback() {
@Override
public void onDismiss(ListView
listView, int[] reverseSortedPositions) {
for (int position :
reverseSortedPositions) {
mAdapter.remove(mAdapter.getItem(position));
}
mAdapter.notifyDataSetChanged();
}
});
listView.setOnTouchListener(touchListener);
//
Setting this scroll listener is required to ensure that during ListView
scrolling,
//
we don't look for swipes.
listView.setOnScrollListener(touchListener.makeScrollListener());
}
@Override
protected void
onListItemClick(ListView listView, View view, int position, long id)
{
Toast.makeText(this,
"Clicked " +
getListAdapter().getItem(position).toString(),
Toast.LENGTH_SHORT).show();
}
}
you may like list view delete row item Click here
More Ref:
http://iamvijayakumar.blogspot.in/2013/09/remove-and-undo-listview-item-with.html
I will be happy if you will provide your feedback or follow this blog. Any suggestion and help will be appreciated.
Thank you :)
please send me demo of this this code show me error...
ReplyDeleteimport static com.nineoldandroids.view.ViewHelper.setAlpha;
ReplyDeleteimport static com.nineoldandroids.view.ViewHelper.setTranslationX;
import static com.nineoldandroids.view.ViewPropertyAnimator.animate;
how to import this three..
you need to add a jar file for that you can download it. just search on google nine old androids then u will get it.
DeleteReally thanks! it's wonderfully easy to implements with your method!
ReplyDeleteThanks again!
Thanks for your appreciation :)
Delete