分享

Android仿QQ消息列表ListView滑动删除效果

 淡淡的痴呆 2014-08-19

运行效果如下:









SwipeListView.java

  1. package com.example.swipelistview.widget;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.util.Log;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8. import android.widget.ListView;  
  9. import android.widget.RelativeLayout;  
  10.   
  11. import com.example.swipelistview.R;  
  12.   
  13. public class SwipeListView extends ListView {  
  14.   
  15.     private static final String TAG = SwipeListView.class.getSimpleName();  
  16.   
  17.     private boolean isShown;  
  18.   
  19.     private View mPreItemView;  
  20.   
  21.     private View mCurrentItemView;  
  22.   
  23.     private float mFirstX;  
  24.   
  25.     private float mFirstY;  
  26.   
  27.     private boolean mIsHorizontal;  
  28.   
  29.     public SwipeListView(Context context) {  
  30.         super(context);  
  31.         // TODO Auto-generated constructor stub  
  32.     }  
  33.   
  34.     public SwipeListView(Context context, AttributeSet attrs) {  
  35.         super(context, attrs);  
  36.         // TODO Auto-generated constructor stub  
  37.     }  
  38.   
  39.     public SwipeListView(Context context, AttributeSet attrs, int defStyle) {  
  40.         super(context, attrs, defStyle);  
  41.         // TODO Auto-generated constructor stub  
  42.     }  
  43.   
  44.     @Override  
  45.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  46.         float lastX = ev.getX();  
  47.         float lastY = ev.getY();  
  48.         switch (ev.getAction()) {  
  49.         case MotionEvent.ACTION_DOWN:  
  50.   
  51.             mIsHorizontal = false;  
  52.               
  53.             mFirstX = lastX;  
  54.             mFirstY = lastY;  
  55.             int motionPosition = pointToPosition((int) mFirstX, (int) mFirstY);  
  56.   
  57.             Log.e(TAG, "onInterceptTouchEvent----->ACTION_DOWN position=" + motionPosition);  
  58.               
  59.             if (motionPosition >= 0) {  
  60.                 View currentItemView = getChildAt(motionPosition - getFirstVisiblePosition());  
  61.                 mPreItemView = mCurrentItemView;  
  62.                 mCurrentItemView = currentItemView;  
  63.             }  
  64.             break;  
  65.   
  66.         case MotionEvent.ACTION_MOVE:  
  67.             float dx = lastX - mFirstX;  
  68.             float dy = lastY - mFirstY;  
  69.   
  70.             if (Math.abs(dx) >= 5 && Math.abs(dy) >= 5) {  
  71.                 return true;  
  72.             }  
  73.             break;  
  74.   
  75.         case MotionEvent.ACTION_UP:  
  76.         case MotionEvent.ACTION_CANCEL:  
  77.   
  78.             Log.i(TAG, "onInterceptTouchEvent----->ACTION_UP");  
  79.             if (isShown && mPreItemView != mCurrentItemView) {  
  80.                 Log.i(TAG, "1---> hiddenRight");  
  81.                 /** 
  82.                  * 情况一: 
  83.                  * <p> 
  84.                  * 一个Item的右边布局已经显示, 
  85.                  * <p> 
  86.                  * 这时候点击任意一个item, 那么那个右边布局显示的item隐藏其右边布局 
  87.                  */  
  88.                 hiddenRight(mPreItemView);  
  89.             }  
  90.             break;  
  91.         }  
  92.   
  93.         return super.onInterceptTouchEvent(ev);  
  94.     }  
  95.   
  96.     @Override  
  97.     public boolean onTouchEvent(MotionEvent ev) {  
  98.         // TODO Auto-generated method stub  
  99.         float lastX = ev.getX();  
  100.         float lastY = ev.getY();  
  101.   
  102.         switch (ev.getAction()) {  
  103.         case MotionEvent.ACTION_DOWN:  
  104.             Log.i(TAG, "---->ACTION_DOWN");  
  105.             break;  
  106.   
  107.         case MotionEvent.ACTION_MOVE:  
  108.             float dx = lastX - mFirstX;  
  109.             float dy = lastY - mFirstY;  
  110.   
  111.             mIsHorizontal = isHorizontalDirectionScroll(dx, dy);  
  112.               
  113.             if (!mIsHorizontal) {  
  114.                 break;  
  115.             }  
  116.   
  117.             Log.i(TAG, "onTouchEvent ACTION_MOVE");  
  118.               
  119.             if (mIsHorizontal) {  
  120.                 if (isShown && mPreItemView != mCurrentItemView) {  
  121.                     Log.i(TAG, "2---> hiddenRight");  
  122.                     /** 
  123.                      * 情况二: 
  124.                      * <p> 
  125.                      * 一个Item的右边布局已经显示, 
  126.                      * <p> 
  127.                      * 这时候左右滑动另外一个item,那个右边布局显示的item隐藏其右边布局 
  128.                      * <p> 
  129.                      * 向左滑动只触发该情况,向右滑动还会触发情况五 
  130.                      */  
  131.                     hiddenRight(mPreItemView);  
  132.                 }  
  133.             }else {  
  134.                 if (isShown) {  
  135.                     Log.i(TAG, "3---> hiddenRight");  
  136.                     /** 
  137.                      * 情况三: 
  138.                      * <p> 
  139.                      * 一个Item的右边布局已经显示, 
  140.                      * <p> 
  141.                      * 这时候上下滚动ListView,那么那个右边布局显示的item隐藏其右边布局 
  142.                      */  
  143.                     hiddenRight(mPreItemView);  
  144.                 }  
  145.             }  
  146.             break;  
  147.         case MotionEvent.ACTION_UP:  
  148.         case MotionEvent.ACTION_CANCEL:  
  149.             Log.i(TAG, "============ACTION_UP");  
  150.             if (isShown) {  
  151.                 Log.i(TAG, "4---> hiddenRight");  
  152.                 /** 
  153.                  * 情况四: 
  154.                  * <p> 
  155.                  * 一个Item的右边布局已经显示, 
  156.                  * <p> 
  157.                  * 这时候左右滑动当前一个item,那个右边布局显示的item隐藏其右边布局 
  158.                  */  
  159.                 hiddenRight(mPreItemView);  
  160.             }  
  161.   
  162.             if (mIsHorizontal) {  
  163.                 if (mFirstX - lastX > 30) {  
  164.                     showRight(mCurrentItemView);  
  165.                 } else {  
  166.                     Log.i(TAG, "5---> hiddenRight");  
  167.                     /** 
  168.                      * 情况五: 
  169.                      * <p> 
  170.                      * 向右滑动一个item,且滑动的距离超过了右边View的宽度的一半,隐藏之。 
  171.                      */  
  172.                     hiddenRight(mCurrentItemView);  
  173.                 }  
  174.                 return true;  
  175.             }  
  176.             break;  
  177.         }  
  178.   
  179.         return super.onTouchEvent(ev);  
  180.     }  
  181.   
  182.     private void showRight(View rightView) {  
  183.         RelativeLayout rl_right=(RelativeLayout)rightView.findViewById(R.id.item_right);  
  184.         rl_right.setVisibility(View.VISIBLE);  
  185.           
  186.         isShown = true;  
  187.     }  
  188.       
  189.     private void hiddenRight(View rightView) {  
  190.           
  191.         RelativeLayout rl_right=(RelativeLayout)rightView.findViewById(R.id.item_right);  
  192.         rl_right.setVisibility(View.GONE);  
  193.           
  194.         isShown = false;  
  195.     }  
  196.   
  197.     /** 
  198.      * @param dx 
  199.      * @param dy 
  200.      * @return judge if can judge scroll direction 
  201.      */  
  202.     private boolean isHorizontalDirectionScroll(float dx, float dy) {  
  203.         boolean mIsHorizontal = true;  
  204.   
  205.         if (Math.abs(dx) > 30 && Math.abs(dx) > 2 * Math.abs(dy)) {  
  206.             mIsHorizontal = true;  
  207.             System.out.println("mIsHorizontal---->" + mIsHorizontal);  
  208.         } else if (Math.abs(dy) > 30 && Math.abs(dy) > 2 * Math.abs(dx)) {  
  209.             mIsHorizontal = false;  
  210.             System.out.println("mIsHorizontal---->" + mIsHorizontal);  
  211.         }  
  212.   
  213.         return mIsHorizontal;  
  214.     }  
  215.       
  216. }  


SwipeAdapter.java

  1. package com.example.swipelistview.adapter;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.util.Log;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.view.ViewGroup;  
  11. import android.widget.BaseAdapter;  
  12. import android.widget.ImageView;  
  13. import android.widget.RelativeLayout;  
  14. import android.widget.TextView;  
  15.   
  16. import com.example.swipelistview.R;  
  17. import com.example.swipelistview.entity.WXMessage;  
  18.   
  19. public class SwipeAdapter extends BaseAdapter {  
  20.     /** 
  21.      * 上下文对象 
  22.      */  
  23.     private Context mContext = null;  
  24.     private List<WXMessage> data;  
  25.       
  26.     /** 
  27.      * @param mainActivity 
  28.      */  
  29.     public SwipeAdapter(Context ctx,List<WXMessage> data) {  
  30.         mContext = ctx;  
  31.         this.data = data;  
  32.     }  
  33.   
  34.     @Override  
  35.     public int getCount() {  
  36. //      return 100;  
  37.         return data.size();  
  38.     }  
  39.   
  40.     @Override  
  41.     public Object getItem(int position) {  
  42.         return null;  
  43.     }  
  44.   
  45.     @Override  
  46.     public long getItemId(int position) {  
  47.         return position;  
  48.     }  
  49.   
  50.     @Override  
  51.     public View getView(final int position, View convertView, ViewGroup parent) {  
  52.           
  53.         ViewHolder holder;  
  54.         if (convertView == null) {  
  55.             convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);  
  56.             holder = new ViewHolder();  
  57.             holder.item_left = (RelativeLayout)convertView.findViewById(R.id.item_left);  
  58.             holder.item_right = (RelativeLayout)convertView.findViewById(R.id.item_right);  
  59.               
  60.             holder.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);  
  61.             holder.tv_title = (TextView)convertView.findViewById(R.id.tv_title);  
  62.             holder.tv_msg = (TextView)convertView.findViewById(R.id.tv_msg);  
  63.             holder.tv_time = (TextView)convertView.findViewById(R.id.tv_time);  
  64.               
  65.             holder.item_right_txt = (TextView)convertView.findViewById(R.id.item_right_txt);  
  66.             convertView.setTag(holder);  
  67.         } else {// 有直接获得ViewHolder  
  68.             holder = (ViewHolder)convertView.getTag();  
  69.         }  
  70.           
  71.         Log.i("SwipeAdapter", "getView position="+position);  
  72.           
  73.         WXMessage msg = data.get(position);  
  74.           
  75.         holder.tv_title.setText(msg.getTitle());  
  76.         holder.tv_msg.setText(msg.getMsg());  
  77.         holder.tv_time.setText(msg.getTime());  
  78.           
  79.         holder.iv_icon.setImageResource(msg.getIcon_id());  
  80.           
  81.         holder.item_right.setOnClickListener(new OnClickListener() {  
  82.             @Override  
  83.             public void onClick(View v) {  
  84.                 if (mListener != null) {  
  85.                     mListener.onRightItemClick(v, position);  
  86.                 }  
  87.             }  
  88.         });  
  89.         return convertView;  
  90.     }  
  91.   
  92.     static class ViewHolder {  
  93.         RelativeLayout item_left;  
  94.         RelativeLayout item_right;  
  95.   
  96.         TextView tv_title;  
  97.         TextView tv_msg;  
  98.         TextView tv_time;  
  99.         ImageView iv_icon;  
  100.   
  101.         TextView item_right_txt;  
  102.     }  
  103.       
  104.     /** 
  105.      * 单击事件监听器 
  106.      */  
  107.     private onRightItemClickListener mListener = null;  
  108.       
  109.     public void setOnRightItemClickListener(onRightItemClickListener listener){  
  110.         mListener = listener;  
  111.     }  
  112.   
  113.     public interface onRightItemClickListener {  
  114.         void onRightItemClick(View v, int position);  
  115.     }  
  116. }  




Demo下载地址:http://download.csdn.net/detail/fx_sky/6913747





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多