RequrIEd:
>我想在ListvIEw中添加来自服务器的Section headers,如Group1,Group2,..等.
使用Undo解除滑动代码.请帮助我实现我的要求.
Link i referred
ListvIEwActivity.class
package com.swipe.delete;import androID.app.Activity;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.AbsListVIEw;import androID.Widget.AdapterVIEw;import androID.Widget.BaseAdapter;import androID.Widget.ListVIEw;import androID.Widget.TextVIEw;import androID.Widget.Toast;import com.hudomju.swipe.SwipetodismisstouchListener;import com.hudomju.swipe.adapter.ListVIEwAdapter;import java.util.ArrayList;import java.util.List;import static androID.Widget.Toast.LENGTH_SHORT;public class ListVIEwActivity extends Activity { private static final int TIME_TO_autoMATICALLY_disMISS_ITEM = 3000; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.List_vIEw_activity); init((ListVIEw) findVIEwByID(R.ID.List_vIEw)); } private voID init(ListVIEw ListVIEw) { final MyBaseAdapter adapter = new MyBaseAdapter(); ListVIEw.setAdapter(adapter); final SwipetodismisstouchListener<ListVIEwAdapter> touchListener = new SwipetodismisstouchListener<>( new ListVIEwAdapter(ListVIEw),new SwipetodismisstouchListener.dismissCallbacks<ListVIEwAdapter>() { @OverrIDe public boolean candismiss(int position) { return true; } @OverrIDe public voID onPendingdismiss(ListVIEwAdapter recyclerVIEw,int position) { } @OverrIDe public voID ondismiss(ListVIEwAdapter vIEw,int position) { adapter.remove(position); } }); touchListener.setdismissDelay(TIME_TO_autoMATICALLY_disMISS_ITEM); ListVIEw.setontouchListener(touchListener); // Setting this scroll Listener is required to ensure that during ListVIEw scrolling,// we don't look for swipes. ListVIEw.setonScrollListener((AbsListVIEw.OnScrollListener) touchListener.makeScrollListener()); ListVIEw.setonItemClickListener(new AdapterVIEw.OnItemClickListener() { @OverrIDe public voID onItemClick(AdapterVIEw<?> parent,VIEw vIEw,int position,long ID) { if (touchListener.existPendingdismisses()) { touchListener.undoPendingdismiss(); } else { Toast.makeText(ListVIEwActivity.this,"position " + position,LENGTH_SHORT).show(); } } }); } static class MyBaseAdapter extends BaseAdapter { private static final int SIZE = 100; private final List<String> mDataSet = new ArrayList<>(); MyBaseAdapter() { for (int i = 0; i < SIZE; i++) mDataSet.add(i,"This is row number " + i); } @OverrIDe public int getCount() { return mDataSet.size(); } @OverrIDe public String getItem(int position) { return mDataSet.get(position); } @OverrIDe public long getItemID(int position) { return position; } public voID remove(int position) { mDataSet.remove(position); notifyDataSetChanged(); } static class VIEwHolder { TextVIEw dataTextVIEw; VIEwHolder(VIEw vIEw) { dataTextVIEw = (TextVIEw) vIEw.findVIEwByID(R.ID.txt_data); vIEw.setTag(this); } } @OverrIDe public VIEw getVIEw(int position,VIEw convertVIEw,VIEwGroup parent) { VIEwHolder vIEwHolder = convertVIEw == null ? new VIEwHolder(convertVIEw = LayoutInflater.from(parent.getContext()) .inflate(R.layout.List_item,parent,false)) : (VIEwHolder) convertVIEw.getTag(); vIEwHolder.dataTextVIEw.setText(mDataSet.get(position)); return convertVIEw; } }}
SwipetodismisstouchListener.class
package com.swipe.Delete;import androID.animation.Animator;import androID.animation.AnimatorListenerAdapter;import androID.animation.ValueAnimator;import androID.graphics.Rect;import androID.os.Handler;import androID.support.annotation.NonNull;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;public class SwipetodismisstouchListener<SomeCollectionVIEw extends VIEwAdapter> implements VIEw.OntouchListener { // Cached VIEwConfiguration and system-wIDe constant values private final int mSlop; private final int mMinFlingVeLocity; private final int mMaxFlingVeLocity; private final long mAnimationTime; // Fixed propertIEs private final SomeCollectionVIEw mRecyclerVIEw; private final dismissCallbacks<SomeCollectionVIEw> mCallbacks; private int mVIEwWIDth = 1; // 1 and not 0 to prevent divIDing by zero // TransIEnt propertIEs private PendingdismissData mPendingdismiss; private float mDownX; private float mDownY; private boolean mSwiPing; private int mSwiPingSlop; private VeLocityTracker mVeLocityTracker; private int mDownposition; private RowContainer mRowContainer; private boolean mPaused; // Handler to dismiss pending items after a delay private final Handler mHandler; private final Runnable mdismissRunnable = new Runnable() { @OverrIDe public voID run() { processpendingdismisses(); } }; private long mdismissDelayMillis = -1; // negative to disable automatic dismissing public class RowContainer { final VIEw container; final VIEw dataContainer; final VIEw undoContainer; boolean dataContainerHasBeendismissed; public RowContainer(VIEwGroup container) { this.container = container; dataContainer = container.getChildAt(0); undoContainer = container.getChildAt(1); dataContainerHasBeendismissed = false; } VIEw getCurrentSwiPingVIEw() { return dataContainerHasBeendismissed ? undoContainer: dataContainer; } } /** * The callback interface used by {@link SwipetodismisstouchListener} to inform its clIEnt * about a successful dismissal of one or more List item positions. */ public interface dismissCallbacks<SomeCollectionVIEw extends VIEwAdapter> { /** * Called to determine whether the given position can be dismissed. */ boolean candismiss(int position); /** * Called when an item is swiped away by the user and the undo layout is completely visible. * Do NOT remove the List item yet,that should be done in { #ondismiss(com.hudomju.swipe.adapter.VIEwAdapter,int)} * This may also be called immediately before and item is completely dismissed. * * @param recyclerVIEw The originating {androID.support.v7.Widget.RecyclerVIEw}. * @param position The position of the dismissed item. */ voID onPendingdismiss(SomeCollectionVIEw recyclerVIEw,int position); /** * Called when the item is completely dismissed and removed from the List,after the undo layout is hIDden. * * @param recyclerVIEw The originating { androID.support.v7.Widget.RecyclerVIEw}. * @param position The position of the dismissed item. */ voID ondismiss(SomeCollectionVIEw recyclerVIEw,int position); } /** * Constructs a new swipe-to-dismiss touch Listener for the given List vIEw. * * @param recyclerVIEw The List vIEw whose items should be dismissable. * @param callbacks The callback to trigger when the user has indicated that she would like to * dismiss one or more List items. */ public SwipetodismisstouchListener(SomeCollectionVIEw recyclerVIEw,dismissCallbacks<SomeCollectionVIEw> callbacks) { VIEwConfiguration vc = VIEwConfiguration.get(recyclerVIEw.getContext()); mSlop = vc.getScaledtouchSlop(); mMinFlingVeLocity = vc.getScaledMinimumFlingVeLocity() * 16; mMaxFlingVeLocity = vc.getScaledMaximumFlingVeLocity(); mAnimationTime = recyclerVIEw.getContext().getResources().getInteger( androID.R.integer.config_shortAnimTime); mRecyclerVIEw = recyclerVIEw; mCallbacks = callbacks; mHandler = new Handler(); } /** * Enables or disables (pauses or resumes) watching for swipe-to-dismiss gestures. * * @param enabled Whether or not to watch for gestures. */ public voID setEnabled(boolean enabled) { mPaused = !enabled; } /** * Set the delay after which the pending items will be dismissed when there was no user action. * Set to a negative value to disable automatic dismissing items. * @param dismissDelayMillis The delay between onPendingdismiss and ondismiss calls,in milliseconds. */ public voID setdismissDelay(long dismissDelayMillis) { this.mdismissDelayMillis = dismissDelayMillis; } /** * Returns an {@link AbsListVIEw.OnScrollListener} to be added to the {@link * ListVIEw} using {@link ListVIEw#setonScrollListener(AbsListVIEw.OnScrollListener)}. * If a scroll Listener is already assigned,the caller should still pass scroll changes through * to this Listener. This will ensure that this {@link SwipetodismisstouchListener} is * paused during List vIEw scrolling.</p> * * @see SwipetodismisstouchListener */ public Object makeScrollListener() { return mRecyclerVIEw.makeScrollListener(new AbsListVIEw.OnScrollListener() { @OverrIDe public voID onScrollStateChanged(AbsListVIEw absListVIEw,int scrollState) { processpendingdismisses(); 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 = mRecyclerVIEw.getWIDth(); } switch (motionEvent.getActionMasked()) { case MotionEvent.ACTION_DOWN: { if (mPaused) { return false; } // Todo: ensure this is a finger,and set a flag // Find the child vIEw that was touched (perform a hit test) Rect rect = new Rect(); int childCount = mRecyclerVIEw.getChildCount(); int[] ListVIEwCoords = new int[2]; mRecyclerVIEw.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 = mRecyclerVIEw.getChildAt(i); child.getHitRect(rect); if (rect.contains(x,y)) { assert child instanceof VIEwGroup && ((VIEwGroup) child).getChildCount() == 2 : "Each child needs to extend from VIEwGroup and have two children"; boolean dataContainerHasBeendismissed = mPendingdismiss != null && mPendingdismiss.position == mRecyclerVIEw.getChildposition(child) && mPendingdismiss.rowContainer.dataContainerHasBeendismissed; mRowContainer = new RowContainer((VIEwGroup) child); mRowContainer.dataContainerHasBeendismissed = dataContainerHasBeendismissed; break; } } if (mRowContainer != null) { mDownX = motionEvent.getRawX(); mDownY = motionEvent.getRawY(); mDownposition = mRecyclerVIEw.getChildposition(mRowContainer.container); if (mCallbacks.candismiss(mDownposition)) { mVeLocityTracker = VeLocityTracker.obtain(); mVeLocityTracker.addMovement(motionEvent); } else { mRowContainer = null; } } return false; } case MotionEvent.ACTION_CANCEL: { if (mVeLocityTracker == null) { break; } if (mRowContainer != null && mSwiPing) { // cancel mRowContainer.getCurrentSwiPingVIEw() .animate() .translationX(0) .Alpha(1) .setDuration(mAnimationTime) .setListener(null); } mVeLocityTracker.recycle(); mVeLocityTracker = null; mDownX = 0; mDownY = 0; mRowContainer = null; mDownposition = ListVIEw.INVALID_position; mSwiPing = false; break; } case MotionEvent.ACTION_UP: { if (mVeLocityTracker == null) { break; } float deltaX = motionEvent.getRawX() - mDownX; mVeLocityTracker.addMovement(motionEvent); mVeLocityTracker.computeCurrentVeLocity(1000); float veLocityX = mVeLocityTracker.getXVeLocity(); float absveLocityX = Math.abs(veLocityX); float absveLocityY = Math.abs(mVeLocityTracker.getYVeLocity()); boolean dismiss = false; boolean dismissRight = false; if (Math.abs(deltaX) > mVIEwWIDth / 2 && mSwiPing) { dismiss = true; dismissRight = deltaX > 0; } else if (mMinFlingVeLocity <= absveLocityX && absveLocityX <= mMaxFlingVeLocity && absveLocityY < absveLocityX && mSwiPing) { // dismiss only if flinging in the same direction as dragging dismiss = (veLocityX < 0) == (deltaX < 0); dismissRight = mVeLocityTracker.getXVeLocity() > 0; } if (dismiss && mDownposition != ListVIEw.INVALID_position) { // dismiss final RowContainer downVIEw = mRowContainer; // mDownVIEw gets null'd before animation ends final int downposition = mDownposition; mRowContainer.getCurrentSwiPingVIEw() .animate() .translationX(dismissRight ? mVIEwWIDth : -mVIEwWIDth) .Alpha(0) .setDuration(mAnimationTime) .setListener(new AnimatorListenerAdapter() { @OverrIDe public voID onAnimationEnd(Animator animation) { performdismiss(downVIEw,downposition); } }); } else { // cancel mRowContainer.getCurrentSwiPingVIEw() .animate() .translationX(0) .Alpha(1) .setDuration(mAnimationTime) .setListener(null); } mVeLocityTracker.recycle(); mVeLocityTracker = null; mDownX = 0; mDownY = 0; mRowContainer = 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; float deltaY = motionEvent.getRawY() - mDownY; if (Math.abs(deltaX) > mSlop && Math.abs(deltaY) < Math.abs(deltaX) / 2) { mSwiPing = true; mSwiPingSlop = deltaX > 0 ? mSlop : -mSlop; mRecyclerVIEw.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)); mRecyclerVIEw.ontouchEvent(cancelEvent); cancelEvent.recycle(); } if (mSwiPing) { mRowContainer.getCurrentSwiPingVIEw().setTranslationX(deltaX - mSwiPingSlop); mRowContainer.getCurrentSwiPingVIEw().setAlpha(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 RowContainer rowContainer; public PendingdismissData(int position,RowContainer rowContainer) { this.position = position; this.rowContainer= rowContainer; } @OverrIDe public int compareto(@NonNull PendingdismissData other) { // Sort by descending position return other.position - position; } } private voID performdismiss(RowContainer dismissVIEw,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. if (mPendingdismiss != null) { boolean dismissingDifferentRow = mPendingdismiss.position != dismissposition; int newposition = mPendingdismiss.position < dismissposition ? dismissposition-1 : dismissposition; processpendingdismisses(); if (dismissingDifferentRow) { addPendingdismiss(dismissVIEw,newposition); } } else { addPendingdismiss(dismissVIEw,dismissposition); } } private voID addPendingdismiss(RowContainer dismissVIEw,int dismissposition) { dismissVIEw.dataContainerHasBeendismissed = true; dismissVIEw.undoContainer.setVisibility(VIEw.VISIBLE); mPendingdismiss = new PendingdismissData(dismissposition,dismissVIEw); // Notify the callbacks mCallbacks.onPendingdismiss(mRecyclerVIEw,dismissposition); // automatically dismiss the item after a certain delay if(mdismissDelayMillis >= 0) mHandler.removeCallbacks(mdismissRunnable); mHandler.postDelayed(mdismissRunnable,mdismissDelayMillis); } /** * If a vIEw was dismissed and the undo container is showing it will proceed with the final * dismiss of the item. * @return whether there were any pending rows to be dismissed. */ public boolean processpendingdismisses() { boolean existPendingdismisses = existPendingdismisses(); if (existPendingdismisses) processpendingdismisses(mPendingdismiss); return existPendingdismisses; } /** * Whether a row has been dismissed and is waiting for confirmation * @return whether there are any pending rows to be dismissed. */ public boolean existPendingdismisses() { return mPendingdismiss != null && mPendingdismiss.rowContainer.dataContainerHasBeendismissed; } /** * If a vIEw was dismissed and the undo container is showing it will undo and make the data * container reappear. * @return whether there were any pending rows to be dismissed. */ public boolean undoPendingdismiss() { boolean existPendingdismisses = existPendingdismisses(); if (existPendingdismisses) { mPendingdismiss.rowContainer.undoContainer.setVisibility(VIEw.GONE); mPendingdismiss.rowContainer.dataContainer .animate() .translationX(0) .Alpha(1) .setDuration(mAnimationTime) .setListener(null); mPendingdismiss = null; } return existPendingdismisses; } private voID processpendingdismisses(final PendingdismissData pendingdismissData) { mPendingdismiss = null; final VIEwGroup.LayoutParams lp = pendingdismissData.rowContainer.container.getLayoutParams(); final int originalHeight = pendingdismissData.rowContainer.container.getHeight(); ValueAnimator animator = ValueAnimator.ofInt(originalHeight,1).setDuration(mAnimationTime); animator.addListener(new AnimatorListenerAdapter() { @OverrIDe public voID onAnimationEnd(Animator animation) { if (mCallbacks.candismiss(pendingdismissData.position)) mCallbacks.ondismiss(mRecyclerVIEw,pendingdismissData.position); pendingdismissData.rowContainer.dataContainer.post(new Runnable() { @OverrIDe public voID run() { pendingdismissData.rowContainer.dataContainer.setTranslationX(0); pendingdismissData.rowContainer.dataContainer.setAlpha(1); pendingdismissData.rowContainer.undoContainer.setVisibility(VIEw.GONE); pendingdismissData.rowContainer.undoContainer.setTranslationX(0); pendingdismissData.rowContainer.undoContainer.setAlpha(1); lp.height = originalHeight; pendingdismissData.rowContainer.container.setLayoutParams(lp); } }); } }); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @OverrIDe public voID onAnimationUpdate(ValueAnimator valueAnimator) { lp.height = (Integer) valueAnimator.getAnimatedValue(); pendingdismissData.rowContainer.container.setLayoutParams(lp); } }); animator.start(); }}解决方法 我已更新并评论您的代码以实现您想要的.首先检查MyBaseAdapter()构造函数,然后检查getVIEw()方法.
Package com.swipe.delete;import androID.app.Activity;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.AbsListVIEw;import androID.Widget.AdapterVIEw;import androID.Widget.BaseAdapter;import androID.Widget.ListVIEw;import androID.Widget.TextVIEw;import androID.Widget.Toast;import com.hudomju.swipe.SwipetodismisstouchListener;import com.hudomju.swipe.adapter.ListVIEwAdapter;import java.util.ArrayList;import java.util.List;import static androID.Widget.Toast.LENGTH_SHORT;public class ListVIEwActivity extends Activity { private static final int TIME_TO_autoMATICALLY_disMISS_ITEM = 3000; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.List_vIEw_activity); init((ListVIEw) findVIEwByID(R.ID.List_vIEw)); } private voID init(ListVIEw ListVIEw) { final MyBaseAdapter adapter = new MyBaseAdapter(); ListVIEw.setAdapter(adapter); final SwipetodismisstouchListener<ListVIEwAdapter> touchListener = new SwipetodismisstouchListener<>( new ListVIEwAdapter(ListVIEw),LENGTH_SHORT).show(); } } }); } static class MyBaseAdapter extends BaseAdapter { private static final int SIZE = 100; private final List<String> mDataSet = new ArrayList<>(); MyBaseAdapter() { for (int i = 0; i < 5; i++){ // You should add an object containing type of vIEw like section or sectionheader along with your string. // Here i am just using string search to detect whether it is sectionheader or section. have a look at getVIEw() Method mDataSet.add("This is Section header " + i); for (int e = 0; e < SIZE; i++){ mDataSet.add(i,"This is section " + e); } } } @OverrIDe public int getCount() { return mDataSet.size(); } @OverrIDe public String getItem(int position) { return mDataSet.get(position); } @OverrIDe public long getItemID(int position) { return position; } public voID remove(int position) { mDataSet.remove(position); notifyDataSetChanged(); } static class VIEwHolder { TextVIEw dataTextVIEw; VIEwHolder(VIEw vIEw) { dataTextVIEw = (TextVIEw) vIEw.findVIEwByID(R.ID.txt_data); vIEw.setTag(this); } } @OverrIDe public VIEw getVIEw(int position,false)) : (VIEwHolder) convertVIEw.getTag(); vIEwHolder.dataTextVIEw.setText(mDataSet.get(position)); if(mDataSet.get(position).indexof("Section header") != -1){ // This is your sectionheader // Customize you sectionheader UI here // IDeally you should use object here so (object.type == 1) can determine whether this is a sectionheader or header }else{ // This is your section // Customize you section UI here } return convertVIEw; } }}
我希望它有所帮助.
总结以上是内存溢出为你收集整理的android – 可以通过滑动删除和撤消项目,从列表视图中的服务器添加节标题全部内容,希望文章能够帮你解决android – 可以通过滑动删除和撤消项目,从列表视图中的服务器添加节标题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)