working on anexpandablelistview
and using swipetodismissnoa detecting swipe gesture on listview
elements, want customize code when perform swipe action on child elements - (which areframelayout
and 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
Post a Comment