android – 可以通过滑动删除和撤消项目,从列表视图中的服务器添加节标题

android – 可以通过滑动删除和撤消项目,从列表视图中的服务器添加节标题,第1张

概述>在我的应用程序中,我添加了“滑动”以在Listview中关闭项目以及“撤消”选项. Requried: >我想在Listview中添加来自服务器的Section Headers,如Group1,Group2,..等. 使用Undo解除滑动代码.请帮助我实现我的要求. Link i referred ListviewActivity.class package com.swipe.delete; >在我的应用程序中,我添加了“滑动”以在ListvIEw中关闭项目以及“撤消”选项.

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 – 可以通过滑动删除和撤消项目,从列表视图中的服务器添加节标题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1135115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存