android侧滑删除列表

来源:互联网 发布:澳门网络真人博客官网 编辑:程序博客网 时间:2024/06/07 23:30

侧滑lis组件

package com.shjy.jingin.ui;import com.shjy.jingin.model.SlideItem;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.ListView;public class ListViewCompat extends ListView {    private static final String TAG = "ListViewCompat";    private SlideView mFocusedItemView;    public ListViewCompat(Context context) {        super(context);    }    public ListViewCompat(Context context, AttributeSet attrs) {        super(context, attrs);    }    public ListViewCompat(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    public void shrinkListItem(int position) {        View item = getChildAt(position);        if (item != null) {            try {                ((SlideView) item).shrink();            } catch (ClassCastException e) {                e.printStackTrace();            }        }    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN: {            int x = (int ) event.getX();            int y = (int ) event.getY();            int position = pointToPosition(x, y);            Log. e(TAG, "postion=" + position);            if (position != INVALID_POSITION) {              SlideItem data = (SlideItem) getItemAtPosition(position);                mFocusedItemView = data.slideView ;                Log. e(TAG, "FocusedItemView=" + mFocusedItemView );            }        }        default:            break;        }        if (mFocusedItemView != null) {            mFocusedItemView.onRequireTouchEvent(event);        }        return super .onTouchEvent(event);    }}

列表布局控件

<com.shjy.jingin.ui.ListViewCompat                    android:id="@+id/work_diary_project_list"                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:layout_marginTop="5dp"                    android:dividerHeight="15dp"                    android:divider="@color/white"                    android:visibility="gone"                    >                </com.shjy.jingin.ui.ListViewCompat>

侧滑条控件

package com.shjy.jingin.ui;import com.shjy.jingin.R;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.Scroller;import android.widget.TextView;/*** SlideView 继承自LinearLayout*/public class SlideView extends LinearLayout {    private static final String TAG = "SlideView";    private Context mContext;    // 用来放置所有view的容器    private LinearLayout mViewContent;    // 用来放置内置view的容器,比如删除 按钮    private RelativeLayout mHolder;    // 弹性滑动对象,提供弹性滑动效果    private Scroller mScroller;    // 滑动回调接口,用来向上层通知滑动事件    private OnSlideListener mOnSlideListener;    // 内置容器的宽度 单位:dp    private int mHolderWidth = 60;    // 分别记录上次滑动的坐标    private int mLastX = 0;    private int mLastY = 0;    // 用来控制滑动角度,仅当角度a满足如下条件才进行滑动:tan a = deltaX / deltaY > 2    private static final int TAN = 2;    public interface OnSlideListener {        // SlideView的三种状态:开始滑动,打开,关闭        public static final int SLIDE_STATUS_OFF = 0;        public static final int SLIDE_STATUS_START_SCROLL = 1;        public static final int SLIDE_STATUS_ON = 2;        /**         * @param view         *            current SlideView         * @param status         *            SLIDE_STATUS_ON, SLIDE_STATUS_OFF or         *            SLIDE_STATUS_START_SCROLL         */        public void onSlide(View view, int status);    }    public SlideView(Context context) {        super(context);        initView();    }    public SlideView(Context context, AttributeSet attrs) {        super(context, attrs);        initView();    }    private void initView() {        mContext = getContext();        // 初始化弹性滑动对象        mScroller = new Scroller(mContext);        // 设置其方向为横向        setOrientation(LinearLayout.HORIZONTAL);        // 将slide_view_merge加载进来        View.inflate(mContext, R.layout.slide_view_merge, this);        mViewContent = (LinearLayout) findViewById(R.id.view_content);        mHolderWidth = Math.round(TypedValue.applyDimension(                TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources()                        .getDisplayMetrics()));    }    // 设置按钮的内容,也可以设置图标啥的,我没写    public void setButtonText(CharSequence text) {         TextView textView = (TextView)findViewById(R.id.delete);         textView.setText(text);    }    // 将view加入到ViewContent中    public void setContentView(View view) {        mViewContent.addView(view);    }    // 设置滑动回调    public void setOnSlideListener(OnSlideListener onSlideListener) {        mOnSlideListener = onSlideListener;    }    // 将当前状态置为关闭    public void shrink() {        if (getScrollX() != 0) {            this.smoothScrollTo(0, 0);        }    }    // 根据MotionEvent来进行滑动,这个方法的作用相当于onTouchEvent    // 如果你不需要处理滑动冲突,可以直接重命名,照样能正常工作    public void onRequireTouchEvent(MotionEvent event) {        int x = (int) event.getX();        int y = (int) event.getY();        int scrollX = getScrollX();        Log.d(TAG, "x=" + x + "  y=" + y);        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN: {            if (!mScroller.isFinished()) {                mScroller.abortAnimation();            }            if (mOnSlideListener != null) {                mOnSlideListener.onSlide(this,                        OnSlideListener.SLIDE_STATUS_START_SCROLL);            }            break;        }        case MotionEvent.ACTION_MOVE: {            int deltaX = x - mLastX;            int deltaY = y - mLastY;            if (Math.abs(deltaX) < Math.abs(deltaY) * TAN) {                // 滑动不满足条件,不做横向滑动                break;            }            // 计算滑动终点是否合法,防止滑动越界            int newScrollX = scrollX - deltaX;            if (deltaX != 0) {                if (newScrollX < 0) {                    newScrollX = 0;                } else if (newScrollX > mHolderWidth) {                    newScrollX = mHolderWidth;                }                this.scrollTo(newScrollX, 0);            }            break;        }        case MotionEvent.ACTION_UP: {            int newScrollX = 0;            // 这里做了下判断,当松开手的时候,会自动向两边滑动,具体向哪边滑,要看当前所处的位置            if (scrollX - mHolderWidth * 0.75 > 0) {                newScrollX = mHolderWidth;            }            // 慢慢滑向终点            this.smoothScrollTo(newScrollX, 0);            // 通知上层滑动事件            if (mOnSlideListener != null) {                mOnSlideListener.onSlide(this,                        newScrollX == 0 ? OnSlideListener.SLIDE_STATUS_OFF                                : OnSlideListener.SLIDE_STATUS_ON);            }            break;        }        default:            break;        }        mLastX = x;        mLastY = y;    }    private void smoothScrollTo(int destX, int destY) {        // 缓慢滚动到指定位置        int scrollX = getScrollX();        int delta = destX - scrollX;        // 以三倍时长滑向destX,效果就是慢慢滑动        mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3);        invalidate();    }    @Override    public void computeScroll() {        if (mScroller.computeScrollOffset()) {            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());            postInvalidate();        }    }}

列表数据模型ArrayAdapter 中的代码

@Override               public View getView(int position, View convertView , ViewGroup parent) {                     ViewHolder holder;                     侧滑控件条在                     SlideView slideView = (SlideView) convertView;                      if (slideView == null) {                           View itemView = LayoutInflater.from(getContext()).inflate(                                          resource, null);                           slideView = new SlideView(EditWorkDiaryActivity.this);                           slideView.setContentView(itemView);                           holder = new ViewHolder(slideView);                           设置侧滑事件的监听器                            slideView.setOnSlideListener(EditWorkDiaryActivity. this);                           slideView.setTag(holder);                     } else {                           holder = (ViewHolder) slideView.getTag();                     }                     Project project = getItem(position);                     project. slideView = slideView;                     project. slideView.shrink();                     holder. name.setText(project.getName());                     holder. deleteHolder.setOnClickListener(new OnClickListener() {                            @Override                            public void onClick(View v) {                                   // 这里处理删除按钮的点击事件,可以删除对话                                   if (v.getId() == R.id.holder) {                                          int position = projectListView.getPositionForView(v);                                          if (position != ListView.INVALID_POSITION ) {                                                SelectContext. projectList.remove(position);                                                 projectAdapter.notifyDataSetChanged();                                                 int heighDP = getHeight(SelectContext.projectList                                                              .size());                                                ViewGroup.LayoutParams params = projectListView                                                              .getLayoutParams();                                                params. height = heighDP;                                                 projectListView.setLayoutParams(params);                                         }                                         Log. e("aaaa", "onClick v=" + v);                                  }                           }                     });                     slideView.setBackgroundResource(R.drawable. rectangle);                      return slideView;              }       }          侧滑事件监听接口        public interface OnSlideListener {        // SlideView的三种状态:开始滑动,打开,关闭        public static final int SLIDE_STATUS_OFF = 0;        public static final int SLIDE_STATUS_START_SCROLL = 1;        public static final int SLIDE_STATUS_ON = 2;        /**         * @param view         *            current SlideView         * @param status         *            SLIDE_STATUS_ON, SLIDE_STATUS_OFF or         *            SLIDE_STATUS_START_SCROLL         */        public void onSlide(View view, int status);    }             @Override        public void onSlide (View view, int status) {               if (mLastSlideViewWithStatusOn != null                           && mLastSlideViewWithStatusOn != view) {                      mLastSlideViewWithStatusOn.shrink();              }               if (status == SLIDE_STATUS_ON) {                      mLastSlideViewWithStatusOn = (SlideView) view;              }       }
0 0
原创粉丝点击