侧滑删除的ListView

Demo在github上的地址:

https://github.com/Hebin320/HorizontalDelete.git

在CSDN的下载地址:

http://download.csdn.net/detail/hebin320320/9653510


效果图如下:

这里写图片描述


Android中可以用Listview的方式动态添加一个列表,像QQ、微信的好友列表都是用Listview动态添加。在QQ里面,有一栏是聊天记录,里面保存着正在跟你聊天的好友或一些推送的消息,这里有一个功能,就是我们可以选择将这个列表项删除,向左滑动,即出现一个删除的按钮,点击删除即可删除列表项,这种就是用到了HorizontalSlideDeleteListView。
首先要重写一个Listview类,并在xml中的Listview引用重写的类:

<com.example.horizontalslidelistview.HorizontalSlideDeleteListView 
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        /> 

在重写类之前,要先写一个Adapter。首先是获取屏幕宽度并初始化删除按钮事件与Item滑动事件:

public HorizontalSlideAdapter(Context context, List<String> objects) {
        super(context, 0, objects);
        // 获取屏幕宽度
        Display defaultDisplay = ((Activity) context).getWindowManager()
                .getDefaultDisplay();
        DisplayMetrics metrics = new DisplayMetrics();
        defaultDisplay.getMetrics(metrics);
        mScreenWidth = metrics.widthPixels;   //屏幕宽度
        mParams = new LinearLayout.LayoutParams(mScreenWidth,
        LinearLayout.LayoutParams.MATCH_PARENT);  //布局参数,动态让HorizontalScrollView中的TextView宽度包裹父容器 
        // 初始化删除按钮事件与item滑动事件
        mDelOnclickImpl = new DeleteButtonOnclickImpl();
        mScrollImpl = new ScrollViewScrollImpl();
    } 

然后需要写一个方法,是实现Listview的滑动功能,并且是左右滑动,

/** HorizontalScrollView的滑动事件 */
    private class ScrollViewScrollImpl implements OnTouchListener {
        /** 记录开始时的坐标 */
        private float startX = 0;
        @SuppressLint("ClickableViewAccessibility")
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            // 如果有划出删除按钮的itemView,就让他滑回去并且锁定本次touch操作,解锁会在父组件的dispatchTouchEvent中进行
                if (mScrollView != null) {
                    scrollView(mScrollView, HorizontalScrollView.FOCUS_LEFT);
                    mScrollView = null;
                    mLockOnTouch = true;
                    return true;
                }
                startX = event.getX();
                break;
            case MotionEvent.ACTION_UP:
                HorizontalScrollView view = (HorizontalScrollView) v;
                // 如果滑动了>50个像素,就显示出删除按钮
                if (startX > event.getX() + 50) {
                    startX = 0;// 因为公用一个事件处理对象,防止错乱,还原startX值
                    scrollView(view, HorizontalScrollView.FOCUS_RIGHT);
                    mScrollView = view;
                } else {
                    scrollView(view, HorizontalScrollView.FOCUS_LEFT);
                }
                break;
            }
            return false;
        }
    }
    /** HorizontalScrollView左右滑动 */
    public void scrollView(final HorizontalScrollView view, final int parameter) {
        view.post(new Runnable() {
            @Override
            public void run() {
                view.pageScroll(parameter);
            }
        });
    } 

然后再写一个方法,让这些列表项可删除,

/** 删除事件 */
    private class DeleteButtonOnclickImpl implements OnClickListener {
        @Override
        public void onClick(View v) {
            final ViewHolder holder = (ViewHolder) v.getTag();
            Toast.makeText(getContext(), "删除第" + holder.position + "项",
                    Toast.LENGTH_SHORT).show();
            Animation animation = AnimationUtils.loadAnimation(getContext(),
                    R.anim.anim_item_delete);
            holder.scrollView.startAnimation(animation);
            animation.setAnimationListener(new AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                }
                @Override
                public void onAnimationRepeat(Animation animation) {
                }
                @Override
                public void onAnimationEnd(Animation animation) {
                    remove(getItem(holder.position));
                }
            });

        }
    } 

这样就写好了Adapter,然后就可以重写Listview方法了,重写的方法继承Listview,Adapter引用重写的Adapter,下面是重写的方法:

public boolean dispatchTouchEvent(MotionEvent ev) {
        if(mAdapter.mLockOnTouch){
            if (ev.getAction() == MotionEvent.ACTION_DOWN
                    || ev.getAction() == MotionEvent.ACTION_MOVE) {
                //让滑动出删除按钮的那个itemView退回去
                if (mAdapter.mScrollView != null) {
                    mAdapter.scrollView(mAdapter.mScrollView,
                            HorizontalScrollView.FOCUS_LEFT);
                    mAdapter.mScrollView = null;
                }
                return true;
            }
            if (ev.getAction() == MotionEvent.ACTION_UP) {
                mAdapter.mLockOnTouch = false;
            }
        }
        return super.dispatchTouchEvent(ev);
    }   
    @Override
    /** 设置adapter */
    public void setAdapter(ListAdapter adapter) {
        super.setAdapter(adapter);
        mAdapter = (HorizontalSlideAdapter) adapter;
    } 

重写完Listview,现在xml中的Listview已经是具有删除功能的了,在主的activity中,创建一个列表即可,创建列表的方式跟普通的创建列表的方式一样,首先先创建一个ArrayList,将需要的内容放到ArrayList中,然后新建一个adapter,将arraylist中的内容放进adapter中,最后设置adapter即可,具体代码如下:

  private ListView mListView;
    private List<String> mDataList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        mListView = (ListView) findViewById(R.id.listview);
        HorizontalSlideAdapter adapter = new HorizontalSlideAdapter(this,
                mDataList);
        mListView.setAdapter(adapter);
    }
    private void initData() {
   mDataList = new ArrayList<String>(); 
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");
    mDataList.add("11");

    } 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值