android - Customizing "SwipetoDismissNOA" to not delete after swipe -


working on anexpandablelistviewand using swipetodismissnoa detecting swipe gesture on listview elements, want customize code when perform swipe action on child elements - (which areframelayoutand have 2 layouts inside them) - the above view go out of screen , below view buttons became visible , again swiping in other direction above view gets back.

can guys me out?

i change somehow per needs accordingly hope of use too.

i used list fragment can use way want.

 package com.example.android.swipedismiss;  import java.util.arraylist;  import java.util.arrays;  import java.util.list;   import android.content.context;  import android.os.bundle;  import android.support.v4.app.fragmentactivity;  import android.support.v4.app.fragmentmanager;  import android.support.v4.app.listfragment;  import android.util.log;  import android.view.gesturedetector;  import android.view.gesturedetector.simpleongesturelistener;  import android.view.layoutinflater;  import android.view.motionevent;  import android.view.view;  import android.view.view.onclicklistener;  import android.view.viewgroup;  import android.widget.arrayadapter;  import android.widget.baseadapter;  import android.widget.button;  import android.widget.imageview;  import android.widget.listview;  import android.widget.textview;  import android.widget.toast;   public class fragmentactivity extends fragmentactivity { // static arrayadapter<string> madapter; 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; private gesturedetector gesturedetector; view.ontouchlistener gesturelistener;  @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);      gesturedetector = new gesturedetector(this, new mygesturedetector());     gesturelistener = new view.ontouchlistener() {         public boolean ontouch(view v, motionevent event) {             return gesturedetector.ontouchevent(event);         }     };      fragmentmanager fm = getsupportfragmentmanager();      if (fm.findfragmentbyid(android.r.id.content) == null) {         mylistfragment1 list = new mylistfragment1();         fm.begintransaction().add(android.r.id.content, list).commit();     } }  public static class mylistfragment1 extends listfragment {       public class mylistadapter extends baseadapter {         string[] month;         context mycontext;         int ints = -1;         public void remove(int position) {             // todo auto-generated method stub             // getitem(get)              if (ints == -1) {                 ints = position;             } else if (position != ints) {                 ints = position;             } else {                 ints = -1;             }              mylistadapter.notifydatasetchanged();          }          private void permanentdelete(int position) {             list<string> list = new arraylist<string>(arrays.aslist(month));             list.remove(position);             month = list.toarray(new string[0]);             mylistadapter.notifydatasetchanged();         }          public mylistadapter(context context, int textviewresourceid, string[] objects) {             super();             month = objects;             mycontext = context;         }          @override         public view getview(int position, view convertview, viewgroup parent) {             // log.e("getview", "here " + month[position]);              layoutinflater inflater = (layoutinflater) mycontext.getsystemservice(context.layout_inflater_service);              view row = null;             // (int = 0; < month.length; i++) {             if (position != ints) {                  row = inflater.inflate(r.layout.row, parent, false);                 textview label = (textview) row.findviewbyid(r.id.month);                 label.settext(month[position]);                 imageview icon = (imageview) row.findviewbyid(r.id.icon);                  // customize icon here                 icon.setimageresource(r.drawable.icon);             } else {                  row = inflater.inflate(r.layout.after_swipe, parent, false);                  button undo = (button) row.findviewbyid(r.id.undo);                 button action1 = (button) row.findviewbyid(r.id.action_one);                 button action2 = (button) row.findviewbyid(r.id.action_two);                 undo.setonclicklistener(new onclicklistener() {                      @override                     public void onclick(view v) {                         // todo auto-generated method stub                         ints = -1;                         mylistadapter.notifydatasetchanged();                     }                 });                 action1.setonclicklistener(new onclicklistener() {                      @override                     public void onclick(view v) {                         // todo auto-generated method stub                         toast.maketext(getactivity().getapplicationcontext(), "in action 1", toast.length_short).show();                      }                 });                 action2.setonclicklistener(new onclicklistener() {                      @override                     public void onclick(view v) {                         // todo auto-generated method stub                         toast.maketext(getactivity().getapplicationcontext(), "in action 2", toast.length_short).show();                      }                 });              }             // }              log.e("selected item", "item" + ints);              return row;         }          @override         public int getcount() {             // todo auto-generated method stub             return month.length;         }          @override         public object getitem(int position) {             // todo auto-generated method stub             return position;         }          @override         public long getitemid(int position) {             return position;         }      }      string[] month = { "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december" };     mylistadapter mylistadapter;      @override     public void onactivitycreated(bundle savedinstancestate) {         // todo auto-generated method stub         super.onactivitycreated(savedinstancestate);         listview listview = getlistview();         swipedismisslistviewtouchlistener touchlistener = new swipedismisslistviewtouchlistener(listview, new swipedismisslistviewtouchlistener.ondismisscallback() {             @override             public void ondismiss(listview listview, int[] reversesortedpositions) {                 (int position : reversesortedpositions) {                     log.e("hello", "hello");                     mylistadapter.remove(position);                 }                 mylistadapter.notifydatasetchanged();             }         });         listview.setontouchlistener(touchlistener);     }      @override     public void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);          /*          * listadapter mylistadapter = new arrayadapter<string>( getactivity(), android.r.layout.simple_list_item_1, month); setlistadapter(mylistadapter);          */         mylistadapter = new mylistadapter(getactivity(), r.layout.row, month);         setlistadapter(mylistadapter);     }      @override     public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {         return inflater.inflate(r.layout.listfragment1, container, false);     }      @override     public void onlistitemclick(listview listview, view v, int position, long id) {         // toast.maketext(getactivity(), getlistview().getitematposition(position).tostring(), toast.length_long).show();         //         // swipedismisslistviewtouchlistener touchlistener = new swipedismisslistviewtouchlistener(listview, new swipedismisslistviewtouchlistener.ondismisscallback() {         // @override         // public void ondismiss(listview listview, int[] reversesortedpositions) {         // (int position : reversesortedpositions) {         // log.e("hello", "hello");         // mylistadapter.remove(position);         // }         // mylistadapter.notifydatasetchanged();         // }         // });         // listview.setontouchlistener(touchlistener);     }  }  class mygesturedetector extends simpleongesturelistener {      @override     public boolean onfling(motionevent e1, motionevent e2, float velocityx, float velocityy) {         log.e("there", "there");         try {             if (math.abs(e1.gety() - e2.gety()) > swipe_max_off_path)                 return false;             // right left swipe             if (e1.getx() - e2.getx() > swipe_min_distance && math.abs(velocityx) > swipe_threshold_velocity) {                 toast.maketext(fragmentactivity.this, "left swipe", toast.length_short).show();             } else if (e2.getx() - e1.getx() > swipe_min_distance && math.abs(velocityx) > swipe_threshold_velocity) {                 toast.maketext(fragmentactivity.this, "right swipe", toast.length_short).show();             }         } catch (exception e) {             // nothing         }         return false;     }      @override     public boolean ondown(motionevent e) {         return true;     } } } 

here swipedismisslistviewtouchlistener.

// beta! don't recommend using in production code yet   /*   * copyright 2012 roman nurik   *   * licensed under apache license, version 2.0 (the "license");   * may not use file except in compliance license.   * may obtain copy of license @   *   *     http://www.apache.org/licenses/license-2.0   *   * unless required applicable law or agreed in writing, software   * distributed under license distributed on "as is" basis,   * without warranties or conditions of kind, either express or implied.   * see license specific language governing permissions ,   * limitations under license.   */   package com.example.android.swipedismiss;   import android.graphics.rect;  import android.os.bundle;  import android.support.v4.app.fragmenttransaction;  import android.util.log;  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 com.pepperpk.eventi.ui.adapter.attendeeslistadapter;  import com.pepperpk.eventi.ui.fragment.attendeesinnerfragment;  import com.pepperpk.eventi.ui.fragment.attendeeslistfragment;   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 { // cached viewconfiguration , system-wide constant values 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 , not 0 prevent dividing 0  // 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; int selectedposition;  /**  * callback interface used {@link swipedismisslistviewtouchlistener} inform client successful dismissal of 1 or more list item positions.  */ public interface ondismisscallback {     /**      * called when user has indicated dismiss 1 or more list item positions.      *       * @param listview      *            originating {@link listview}.      * @param reversesortedpositions      *            array of positions dismiss, sorted in descending order convenience.      */     void ondismiss(listview listview, int[] reversesortedpositions); }  /**  * constructs new swipe-to-dismiss touch listener given list view.  *   * @param listview  *            list view items should dismissable.  * @param callback  *            callback trigger when user has indicated dismiss 1 or more list items.  */ 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; }  /**  * enables or disables (pauses or resumes) watching swipe-to-dismiss gestures.  *   * @param enabled  *            whether or not watch gestures.  */ public void setenabled(boolean enabled) {     mpaused = !enabled; }  /**  * returns {@link android.widget.abslistview.onscrolllistener} added {@link listview} using {@link listview#setonscrolllistener(android.widget.abslistview.onscrolllistener)}. if scroll listener assigned, caller should still pass scroll changes through  * listener. ensure {@link swipedismisslistviewtouchlistener} paused during list view scrolling.</p>  *   * @see {@link swipedismisslistviewtouchlistener}  */ 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;         }          // todo: ensure finger, , set flag          // find child view touched (perform 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;         (int = 0; < 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) {             if (dismissright) {                 log.e("right", "right");             } else {                 log.e("left", "left");             }             // 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);                     log.e("here am", "here am");                 }             });         } else {             // cancel             log.e("here else", "here else");             animate(mdownview).translationx(0).alpha(1).setduration(manimationtime).setlistener(null);             ((attendeeslistadapter)mlistview.getadapter()).onclick(selectedposition);          }         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 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 descending position         return other.position - position;     } }  private void performdismiss(final view dismissview, final int dismissposition) {     // animate dismissed list item zero-height , fire dismiss callback when     // dismissed list item animations have completed. triggers layout on each animation     // frame; in future may want smarter , 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 pending dismisses.                 // sort descending position                 collections.sort(mpendingdismisses);                  int[] dismisspositions = new int[mpendingdismisses.size()];                 (int = mpendingdismisses.size() - 1; >= 0; i--) {                     dismisspositions[i] = mpendingdismisses.get(i).position;                 }                 mcallback.ondismiss(mlistview, dismisspositions);                  viewgroup.layoutparams lp;                 (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();      --mdismissanimationrefcount;     if (mdismissanimationrefcount == 0) {         // no active animations, process pending dismisses.         // sort descending position         collections.sort(mpendingdismisses);          int[] dismisspositions = new int[mpendingdismisses.size()];         (int = mpendingdismisses.size() - 1; >= 0; i--) {             dismisspositions[i] = mpendingdismisses.get(i).position;         }         mcallback.ondismiss(mlistview, dismisspositions);          viewgroup.layoutparams lpp;         (pendingdismissdata pendingdismiss : mpendingdismisses) {             // reset view presentation             setalpha(pendingdismiss.view, 1f);             settranslationx(pendingdismiss.view, 0);             lpp = pendingdismiss.view.getlayoutparams();             lpp.height = originalheight;             pendingdismiss.view.setlayoutparams(lp);         }          mpendingdismisses.clear();     } }  } 

Comments