ListView侧滑删除----->SlideView

时间过得真快,国庆小长假就结束了,好伤心呜呜—-已经开始了,我去,已经结束了?明天小伙伴们要继续上班了!该收收心好好工作了!有木有很激动!哈哈!相信大家对listview应该非常熟悉了,可以说耳闻能祥!我这里就不再赘述了,言贵正传!大家先看下效果
这里写图片描述

主要分为下面五种
-PrivateListingAdapter
-SlideListViewActivity
-SlideListView
-SlideView
-MessageBean

首先说下adapter跟普通适配器一样继承BaseAdapter然后实现OnClickListener监听事件,当用户想有侧滑时移除SlideListView中item中的某一项position,然后notifyDataSetChanged();通知listview刷新数据。
主要代码如下

 holder.deleteViewHolder.setOnClickListener(new OnClickListener() {
                                @Override
                        public void onClick(View v) {
                            // T删除某一个item
                            mList.remove(position);
                            //刷新数据
                            notifyDataSetChanged();
                        }
                    });

SlideLsitViewActivity主要负责绑定SlideListView,然后通过更改Model实现数据的更新
private void initView() {
        // 初始化操作
        mSlideListView=(SlideListView) findViewById(R.id.slidelv);
        adapter=new PrivateListingAdapter(this);
        //创建一个list列表
        ArrayList<MessageBean> mMessageList = new        ArrayList<MessageBean>();

        for (int i = 0; i < 20; i++) {
            //遍历item
            MessageBean bean=new MessageBean();
            //判断当前取模为3是否等于零然后添加相应的信息
            if(i % 3==0){
                bean.iconRes=R.drawable.default_qq_avatar;
                bean.title="网易新闻";
                bean.msg="创智播客创始人猝死";
                bean.time="2016-10-06";

            }else{
                bean.iconRes=R.drawable.wechat_icon;
                bean.title="搜狐新闻";
                bean.msg="杨洋地铁与粉丝骚扰";
                bean.time="2016-10-04";
            }
            //将Model添加到集合中
            mMessageList.add(bean);

        }               

下面进行适配器的绑定以及实现OnItemClickListener监听事件打印相应的position位置代码如下

      adapter.setmMessageItems(mMessageList);
        mSlideListView.setAdapter(adapter);
        mSlideListView.setOnItemClickListener(this);

SlideListView继承ListView重写ListView中方法以及实现当手指向右滑动的监听记录当前手指记录的x,y轴坐标,然后判断当前是开始滑动,还是停止滑动,还是右滑等,实现代码如下

public boolean onTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    switch (ev.getAction()) {
    /**手指按下**/
    case MotionEvent.ACTION_DOWN:
        int x=(int) ev.getX();
        int y=(int) ev.getY();
        int pos=pointToPosition(x, y);
        Log.i(TAG, "pos="+pos);
        if(pos!=INVALID_POSITION){
            MessageBean msg=(MessageBean) getItemAtPosition(pos);
            mSlideView=msg.mSlideView;
            Log.i(TAG, "mSlideView="+mSlideView);

        break;

SlideView主要实现手指侧滑时的OnSlideListener事件,代码如下

 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_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 >mHoldeWid) {
                       newScrollX = mHoldeWid;
                   }
                   this.scrollTo(newScrollX, 0);
               }
               break;
           }
           case MotionEvent.ACTION_UP: {
               int newScrollX = 0;
               if (scrollX - mHoldeWid * 0.75 > 0) {
                   newScrollX = mHoldeWid;
               }
               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;
       }
   MessageBean  里面主要包括一些图片资源,标题,信息,时间以及SlideView侧滑,代码如下。
 public int iconRes;
    public String title;
    public String msg;
    public String time;
    public SlideView mSlideView;    
基本功能就这些,主要通过手向右侧滑然后删除ListView中某一项的item中position,然后适配器Adapter通知ListView刷新。
下面是全部代码!
    package com.zm.ui;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;

import com.zm.adapter.PrivateListingAdapter;
import com.zm.bean.MessageBean;
import com.zm.view.SlideListView;
import com.zm.view.SlideView;

public class SlideListViewActivity extends Activity implements OnItemClickListener{
    private SlideView mSlideView;
    private SlideListView mSlideListView;
    private  PrivateListingAdapter adapter;
    private List<MessageBean> mList=new ArrayList<MessageBean>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_privatelist);
        initView();
    }
    private void initView() {
        // 初始化操作
        mSlideListView=(SlideListView) findViewById(R.id.slidelv);
        adapter=new PrivateListingAdapter(this);
        ArrayList<MessageBean> mMessageList = new ArrayList<MessageBean>();

        for (int i = 0; i < 20; i++) {
            MessageBean bean=new MessageBean();
            if(i % 3==0){
                bean.iconRes=R.drawable.default_qq_avatar;
                bean.title="网易新闻";
                bean.msg="创智播客创始人猝死";
                bean.time="2016-10-06";

            }else{
                bean.iconRes=R.drawable.wechat_icon;
                bean.title="搜狐新闻";
                bean.msg="杨洋地铁与粉丝骚扰";
                bean.time="2016-10-04";
            }
            mMessageList.add(bean);

        }
        adapter.setmMessageItems(mMessageList);
        mSlideListView.setAdapter(adapter);
        mSlideListView.setOnItemClickListener(this);


    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        // TODO Auto-generated method stub
        Log.i("tag", "position="+position);
    }

}
___    ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___      
package com.zm.adapter;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.zm.R;
import com.zm.bean.MessageBean;
import com.zm.view.SlideView;
import com.zm.view.SlideView.onSlideListener;

public class PrivateListingAdapter extends BaseAdapter implements onSlideListener{
    private static final String TAG="PrivateListingAdapter";
    private Context mContext;
    private List<MessageBean> mList =new ArrayList<MessageBean>();
    private SlideView mSlideView;
    private LayoutInflater mLayoutInflater;
    public PrivateListingAdapter(Context context) {
        mContext = context;
        mLayoutInflater = LayoutInflater.from(mContext);
        //mLayoutInflater=(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void setmMessageItems(List<MessageBean> mMessageItems) {
        this.mList = mMessageItems;
    }

//  public PrivateListingAdapter(Context mContext,List<MessageBean> mList){
//      this.mContext=mContext;
//      this.mList=mList;
//      /**获取系统布局服务**/
//      mLayoutInflater=LayoutInflater.from(mContext);
//      
//  }
    @Override
    public int getCount() {
        if(mList==null){
            mList=new ArrayList<MessageBean>();
        }
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder=null;
        SlideView mSlideView=(SlideView) convertView;
        if(mSlideView==null){
            View item=mLayoutInflater.inflate(R.layout.privatelist_item, null);
            mSlideView=new SlideView(mContext);
            mSlideView.setContentView(item);
            holder=new ViewHolder(mSlideView);
            mSlideView.setOnSlideListener(this);
            mSlideView.setTag(holder);

        }else{
            holder=(ViewHolder) mSlideView.getTag();
            MessageBean mb=mList.get(position);
            mb.mSlideView=mSlideView;
            mb.mSlideView.shrink();

                    holder.iv_icon.setImageResource(mb.iconRes);
                    holder.tv_title.setText(mb.title);
                    holder.tv_msg.setText(mb.msg);
                    holder.tv_time.setText(mb.time);
                    holder.deleteViewHolder.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            // T删除某一个item
                            mList.remove(position);
                            //刷新数据
                            notifyDataSetChanged();
                        }
                    });

        }
        return mSlideView;
    }

    @Override
    public void onSlide(View view, int status) {
        // TODO Auto-generated method stub
        if(mSlideView!=null&&mSlideView!=view){
            mSlideView.shrink();

        }
        if(status==SLIDE_STATUS_ON){
            mSlideView=(SlideView) view;
        }
    }
    private static class ViewHolder{
        public ImageView iv_icon;
        private TextView tv_title;
        public TextView tv_msg;
        public TextView tv_time;
        public ViewGroup deleteViewHolder;
        /**
         * 初始化
         * @param v
         */
        ViewHolder(View v){
            iv_icon=(ImageView) v.findViewById(R.id.icon);
            tv_title=(TextView) v.findViewById(R.id.title);
            tv_msg=(TextView) v.findViewById(R.id.msg);
            tv_time=(TextView) v.findViewById(R.id.time);
            deleteViewHolder= (ViewGroup) v.findViewById(R.id.holder);
        }
    }

}
___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___  
package com.zm.bean;

import com.zm.view.SlideView;

public class MessageBean {
    public int iconRes;
    public String title;
    public String msg;
    public String time;
    public SlideView mSlideView;
    public int getIconRes() {
        return iconRes;
    }
    public void setIconRes(int iconRes) {
        this.iconRes = iconRes;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public SlideView getmSlideView() {
        return mSlideView;
    }
    public  MessageBean(){
        super();
    }
    public MessageBean(int iconRes, String title, String msg, String time,
            SlideView mSlideView) {
        super();
        this.iconRes = iconRes;
        this.title = title;
        this.msg = msg;
        this.time = time;
        this.mSlideView = mSlideView;
    }
    public void setmSlideView(SlideView mSlideView) {
        this.mSlideView = mSlideView;
    }
    @Override
    public String toString() {
        return "MessageBean [iconRes=" + iconRes + ", title=" + title
                + ", msg=" + msg + ", time=" + time + ", mSlideView="
                + mSlideView + "]";
    }

}

___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___  
package com.zm.view;

import com.zm.R;

import android.content.Context;
import android.graphics.drawable.GradientDrawable.Orientation;
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;

public class SlideView extends LinearLayout {
//  private TextView delete;
    private static final String TAG="SlideView";
    /**上下文对象**/
    private Context mContext;
    /**显示內容**/
    private LinearLayout mViewContent;
    private RelativeLayout mViewHolder;
    /**滚动**/
    private Scroller mScroller;
    private onSlideListener mOnSlideListener;
    private int mHoldeWid=120;
    private int mLastX=0;
    private int mLastY=0;
    private static final int TAN=2;
    /**回调监听**/
    public interface onSlideListener{
        /**停止滚动三种状态**/
        public static final int SLIDE_STATUS_OFF=0;
        /**执行滚动**/
        public static final int SLIDE_STATUS_SCROLL=1;
        /**开始滚动**/
        public static final int SLIDE_STATUS_ON=2;
         public void onSlide(View view, int status);
    }
    public SlideView(Context context) {
        super(context);
        initView();
    }
     public void shrink() {
            if (getScrollX() != 0) {
                this.smoothScrollTo(0, 0);
            }
        }
    private void smoothScrollTo(int destX, int destY) {
        // TODO Auto-generated method stub
        //缓慢滚动指定位置
        int scrollX=getScrollX();
        int delta=destX=destY;
        mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta)*3);
        invalidate();

    }
    private void initView() {
        //初始化操作
        mContext=getContext();
        /**初始化滚动实例**/
        mScroller=new Scroller(mContext);
        /**设置为水平方向**/
        setOrientation(LinearLayout.HORIZONTAL);
        View.inflate(mContext, R.layout.privatelisting_delete_merge, this);
        mViewContent=(LinearLayout) findViewById(R.id.view_content);
        mHoldeWid=Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mHoldeWid, getResources().getDisplayMetrics()));


    }

    public SlideView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        initView();
    }
      public void setButtonText(CharSequence text) {
          ((TextView)findViewById(R.id.delete)).setText(text);
        }
    public void setContentView(View v){
        mViewContent.addView(v);
    }
    @Override
    public void computeScroll() {
        if(mScroller.computeScrollOffset()){
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            postInvalidate();
        }
        super.computeScroll();
    }
    public void setOnSlideListener(onSlideListener onSlideListener){
        mOnSlideListener=onSlideListener;
    }
    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_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 >mHoldeWid) {
                       newScrollX = mHoldeWid;
                   }
                   this.scrollTo(newScrollX, 0);
               }
               break;
           }
           case MotionEvent.ACTION_UP: {
               int newScrollX = 0;
               if (scrollX - mHoldeWid * 0.75 > 0) {
                   newScrollX = mHoldeWid;
               }
               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;
       }


    }

___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___  


package com.zm.view;

import com.zm.bean.MessageBean;

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 SlideListView extends ListView {
    private static final String TAG="SlideListView";
    private SlideView mSlideView;
    public SlideListView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }
    public SlideListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public SlideListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
    }

    public void shrinkListItem(int position){
        View view=getChildAt(position);
        if(view!=null){
            try {
                ((SlideView) view).shrink();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
@Override
public boolean onTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    switch (ev.getAction()) {
    /**手指按下**/
    case MotionEvent.ACTION_DOWN:
        int x=(int) ev.getX();
        int y=(int) ev.getY();
        int pos=pointToPosition(x, y);
        Log.i(TAG, "pos="+pos);
        if(pos!=INVALID_POSITION){
            MessageBean msg=(MessageBean) getItemAtPosition(pos);
            mSlideView=msg.mSlideView;
            Log.i(TAG, "mSlideView="+mSlideView);

        break;

        }
    default:
        break;
    }
    if(mSlideView!=null){
        mSlideView.onRequireTouchEvent(ev);
    }
    return super.onTouchEvent(ev);
}
}

到这里步骤基本结束了!有兴趣的童鞋欢迎加入此群进行交流!
喜欢的加群疯狂Android进阶之旅
转载请注明出处!http://blog.csdn.net/qq_15950325/article/details/52752904谢谢合作!
源码(http://download.csdn.net/detail/qq_15950325/9647117“)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值