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

来源:互联网 发布:守望max 数据不更新 编辑:程序博客网 时间:2024/05/18 02:03

时间过得真快,国庆小长假就结束了,好伤心呜呜—-已经开始了,我去,已经结束了?明天小伙伴们要继续上班了!该收收心好好工作了!有木有很激动!哈哈!相信大家对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();            }        }    }@Overridepublic 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 0
原创粉丝点击