仿QQ列表左滑删除效果

最近项目做完了,把用到的效果以及遇到的问题总结出来。下面是仿QQ列表左滑删除效果。

效果如下:

MainActivity代码如下:

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity {


    private AppAdapter mAdapter;
    private SwipeMenuListView mListView;
    private List<String> list=new ArrayList<>();
    private LinearLayout layout_main_nextpage;
    // 用于分页显示数据的属性
    private int curPage = 1;
    private int pageCount = 5;// 总页数

    private boolean isBottom = false;// 判断是否滚动到数据最后一条


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        for (int i=0;i<20;i++){
            list.add("数据"+i);
        }

        mListView = (SwipeMenuListView) findViewById(R.id.listView);
        layout_main_nextpage = (LinearLayout) findViewById(R.id.layout_main_nextpage);
        mAdapter = new AppAdapter();
        mListView.setAdapter(mAdapter);

        // step 1. create a MenuCreator 创建一个 menu创建者  可以添加左划出现的 菜单选项
        SwipeMenuCreator creator = new SwipeMenuCreator() {

            @Override
            public void create(SwipeMenu menu) {
                // create "open" item  创建open选项
//                SwipeMenuItem openItem = new SwipeMenuItem(
//                        getApplicationContext());
//                // set item background
//                openItem.setBackground(new ColorDrawable(Color.rgb(0xC9, 0xC9,
//                        0xCE)));
//                // set item width
//                openItem.setWidth(dp2px(90));
//                // set item title
//                openItem.setTitle("Open");
//                // set item title fontsize
//                openItem.setTitleSize(18);
//                // set item title font color
//                openItem.setTitleColor(Color.WHITE);
//                // add to menu 添加到菜单中
//                menu.addMenuItem(openItem);

                // create "delete" item 创建删除选项
                SwipeMenuItem deleteItem = new SwipeMenuItem(
                        getApplicationContext());
                // set item background
                deleteItem.setBackground(new ColorDrawable(Color.rgb(0xF9,
                        0x3F, 0x25)));
                // set item width
                deleteItem.setWidth(dp2px(90));
                // set a icon
                deleteItem.setIcon(R.drawable.ic_delete);
                // add to menu 将删除选项添加到 菜单中
                menu.addMenuItem(deleteItem);
            }
        };
        //点击加载更多 加载数据
        layout_main_nextpage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
        // set creator
        mListView.setMenuCreator(creator);

        // step 2. listener item click event 左划菜单选项 点击监听事件
        mListView.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
            @Override
            public void onMenuItemClick(int position, SwipeMenu menu, int index) {
                String s = list.get(position);
                switch (index) {
                    case 0://选择删除
                        // open
//                        open(item);
                        list.remove(position);
                        mAdapter.notifyDataSetChanged();
                        break;
                    case 1:
                        // delete
//             delete(item);

                        break;
                }
            }
        });

        // set SwipeListener
        mListView.setOnSwipeListener(new SwipeMenuListView.OnSwipeListener() {

            @Override
            public void onSwipeStart(int position) {
                // swipe start
            }

            @Override
            public void onSwipeEnd(int position) {
                // swipe end
            }
        });

        // other setting
//    listView.setCloseInterpolator(new BounceInterpolator());

        // test item long click 长点击事件
        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view,
                                           int position, long id) {
                Toast.makeText(getApplicationContext(), position + " long click", Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        //listview的滑动监听
        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int i) {
                if (isBottom) {
// 如果滚到最后一条数据(即:屏幕最底端),则显示:“加载更多新数据”
                    if (curPage < pageCount) {
                        layout_main_nextpage.setVisibility(View.VISIBLE);
                    }
                } else {
                    layout_main_nextpage.setVisibility(View.GONE);
                }
            }

            @Override
            public void onScroll(AbsListView absListView, int i, int i1, int i2) {
                isBottom=(i+i1==i2);
            }
        });



    }
    class AppAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public String getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = View.inflate(getApplicationContext(),
                        R.layout.item_list_app, null);
                new ViewHolder(convertView);
            }
            ViewHolder holder = (ViewHolder) convertView.getTag();

//            holder.iv_icon.setImageDrawable(item.loadIcon(getPackageManager()));
//            holder.tv_name.setText(item.loadLabel(getPackageManager()));
            holder.tv_name.setText(list.get(position));
            return convertView;
        }

        class ViewHolder {
            ImageView iv_icon;
            TextView tv_name;

            public ViewHolder(View view) {
                iv_icon = (ImageView) view.findViewById(R.id.iv_icon);
                tv_name = (TextView) view.findViewById(R.id.tv_name);
                view.setTag(this);
            }
        }
    }

    private int dp2px(int dp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
                getResources().getDisplayMetrics());
    }
}

main.xml代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:clickable="true"
   >
    <www.doolii.cn.swiptlistviewdemo.SwipeMenuListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" ></www.doolii.cn.swiptlistviewdemo.SwipeMenuListView>
    <LinearLayout
        android:orientation="horizontal"
        android:id="@+id/layout_main_nextpage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="#000"
        android:gravity="center"
        android:padding="5dp">

    <ProgressBar
        android:id="@+id/progressBar_main"
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text_main_nextpage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:textSize="18sp"
        android:onClick="clickButton"
        android:textColor="#fff"
        android:text="点击加载更多数据" />
    </LinearLayout>
</RelativeLayout>
以下是用到的代码:

SwipeMenu代码如下:

public class SwipeMenu {

   private Context mContext;
   private List<SwipeMenuItem> mItems;
   private int mViewType;

   public SwipeMenu(Context context) {
      mContext = context;
      mItems = new ArrayList<SwipeMenuItem>();
   }

   public Context getContext() {
      return mContext;
   }

   public void addMenuItem(SwipeMenuItem item) {
      mItems.add(item);
   }

   public void removeMenuItem(SwipeMenuItem item) {
      mItems.remove(item);
   }

   public List<SwipeMenuItem> getMenuItems() {
      return mItems;
   }

   public SwipeMenuItem getMenuItem(int index) {
      return mItems.get(index);
   }

   public int getViewType() {
      return mViewType;
   }

   public void setViewType(int viewType) {
      this.mViewType = viewType;
   }
}
SwipeMenuAdapter代码如下:
import android.content.Context;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.WrapperListAdapter;


/**
 * 
 * @author baoyz
 * @date 2014-8-24
 * 
 */
public class SwipeMenuAdapter implements WrapperListAdapter,
      SwipeMenuView.OnSwipeItemClickListener {

   private ListAdapter mAdapter;
   private Context mContext;
   private SwipeMenuListView.OnMenuItemClickListener onMenuItemClickListener;

   public SwipeMenuAdapter(Context context, ListAdapter adapter) {
      mAdapter = adapter;
      mContext = context;
   }

   @Override
   public int getCount() {
      return mAdapter.getCount();
   }

   @Override
   public Object getItem(int position) {
      return mAdapter.getItem(position);
   }

   @Override
   public long getItemId(int position) {
      return mAdapter.getItemId(position);
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      SwipeMenuLayout layout = null;
      if (convertView == null) {
         View contentView = mAdapter.getView(position, convertView, parent);
         SwipeMenu menu = new SwipeMenu(mContext);
         menu.setViewType(mAdapter.getItemViewType(position));
         createMenu(menu);
         SwipeMenuView menuView = new SwipeMenuView(menu,
               (SwipeMenuListView) parent);
         menuView.setOnSwipeItemClickListener(this);
         SwipeMenuListView listView = (SwipeMenuListView) parent;
         layout = new SwipeMenuLayout(contentView, menuView,
               listView.getCloseInterpolator(),
               listView.getOpenInterpolator());
         layout.setPosition(position);
      } else {
         layout = (SwipeMenuLayout) convertView;
         layout.closeMenu();
         layout.setPosition(position);
         View view = mAdapter.getView(position, layout.getContentView(),
               parent);
      }
      return layout;
   }

   public void createMenu(SwipeMenu menu) {
      // Test Code
      SwipeMenuItem item = new SwipeMenuItem(mContext);
      item.setTitle("Item 1");
      item.setBackground(new ColorDrawable(Color.GRAY));
      item.setWidth(300);
      menu.addMenuItem(item);

      item = new SwipeMenuItem(mContext);
      item.setTitle("Item 2");
      item.setBackground(new ColorDrawable(Color.RED));
      item.setWidth(300);
      menu.addMenuItem(item);
   }

   @Override
   public void onItemClick(SwipeMenuView view, SwipeMenu menu, int index) {
      if (onMenuItemClickListener != null) {
         onMenuItemClickListener.onMenuItemClick(view.getPosition(), menu,
               index);
      }
   }

   public void setOnMenuItemClickListener(
         SwipeMenuListView.OnMenuItemClickListener onMenuItemClickListener) {
      this.onMenuItemClickListener = onMenuItemClickListener;
   }

   @Override
   public void registerDataSetObserver(DataSetObserver observer) {
      mAdapter.registerDataSetObserver(observer);
   }

   @Override
   public void unregisterDataSetObserver(DataSetObserver observer) {
      mAdapter.unregisterDataSetObserver(observer);
   }

   @Override
   public boolean areAllItemsEnabled() {
      return mAdapter.areAllItemsEnabled();
   }

   @Override
   public boolean isEnabled(int position) {
      return mAdapter.isEnabled(position);
   }

   @Override
   public boolean hasStableIds() {
      return mAdapter.hasStableIds();
   }

   @Override
   public int getItemViewType(int position) {
      return mAdapter.getItemViewType(position);
   }

   @Override
   public int getViewTypeCount() {
      return mAdapter.getViewTypeCount();
   }

   @Override
   public boolean isEmpty() {
      return mAdapter.isEmpty();
   }

   @Override
   public ListAdapter getWrappedAdapter() {
      return mAdapter;
   }

}
 
SwipeMenuCreator 代码如下:
public interface SwipeMenuCreator {

   void create(SwipeMenu menu);
}
SwipeMenu代码如下:
public class SwipeMenuItem {

   private int id;
   private Context mContext;
   private String title;
   private Drawable icon;
   private Drawable background;
   private int titleColor;
   private int titleSize;
   private int width;

   public SwipeMenuItem(Context context) {
      mContext = context;
   }

   public int getId() {
      return id;
   }

   public void setId(int id) {
      this.id = id;
   }

   public int getTitleColor() {
      return titleColor;
   }

   public int getTitleSize() {
      return titleSize;
   }

   public void setTitleSize(int titleSize) {
      this.titleSize = titleSize;
   }

   public void setTitleColor(int titleColor) {
      this.titleColor = titleColor;
   }

   public String getTitle() {
      return title;
   }

   public void setTitle(String title) {
      this.title = title;
   }

   public void setTitle(int resId) {
      setTitle(mContext.getString(resId));
   }

   public Drawable getIcon() {
      return icon;
   }

   public void setIcon(Drawable icon) {
      this.icon = icon;
   }

   public void setIcon(int resId) {
      this.icon = mContext.getResources().getDrawable(resId);
   }

   public Drawable getBackground() {
      return background;
   }

   public void setBackground(Drawable background) {
      this.background = background;
   }

   public void setBackground(int resId) {
      this.background = mContext.getResources().getDrawable(resId);
   }

   public int getWidth() {
      return width;
   }

   public void setWidth(int width) {
      this.width = width;
   }

}
SwipeMenuLayout 代码如下:
import android.content.Context;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v4.widget.ScrollerCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.GestureDetector.OnGestureListener;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.Interpolator;
import android.widget.AbsListView;
import android.widget.FrameLayout;

/**
 * 
 * @author baoyz
 * @date 2014-8-23
 * 
 */
public class SwipeMenuLayout extends FrameLayout {

   private static final int CONTENT_VIEW_ID = 1;
   private static final int MENU_VIEW_ID = 2;

   private static final int STATE_CLOSE = 0;
   private static final int STATE_OPEN = 1;

   private View mContentView;
   private SwipeMenuView mMenuView;
   private int mDownX;
   private int state = STATE_CLOSE;
   private GestureDetectorCompat mGestureDetector;
   private OnGestureListener mGestureListener;
   private boolean isFling;
   private int MIN_FLING = dp2px(15);
   private int MAX_VELOCITYX = -dp2px(500);
   private ScrollerCompat mOpenScroller;
   private ScrollerCompat mCloseScroller;
   private int mBaseX;
   private int position;
   private Interpolator mCloseInterpolator;
   private Interpolator mOpenInterpolator;

   public SwipeMenuLayout(View contentView, SwipeMenuView menuView) {
      this(contentView, menuView, null, null);
   }

   public SwipeMenuLayout(View contentView, SwipeMenuView menuView,
         Interpolator closeInterpolator, Interpolator openInterpolator) {
      super(contentView.getContext());
      mCloseInterpolator = closeInterpolator;
      mOpenInterpolator = openInterpolator;
      mContentView = contentView;
      mMenuView = menuView;
      mMenuView.setLayout(this);
      init();
   }

   // private SwipeMenuLayout(Context context, AttributeSet attrs, int
   // defStyle) {
   // super(context, attrs, defStyle);
   // }

   private SwipeMenuLayout(Context context, AttributeSet attrs) {
      super(context, attrs);
   }

   private SwipeMenuLayout(Context context) {
      super(context);
   }

   public int getPosition() {
      return position;
   }

   public void setPosition(int position) {
      this.position = position;
      mMenuView.setPosition(position);
   }

   private void init() {
      setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.WRAP_CONTENT));
      mGestureListener = new SimpleOnGestureListener() {
         @Override
         public boolean onDown(MotionEvent e) {
            isFling = false;
            return true;
         }

         @Override
         public boolean onFling(MotionEvent e1, MotionEvent e2,
               float velocityX, float velocityY) {
            // TODO
            if ((e1.getX() - e2.getX()) > MIN_FLING
                  && velocityX < MAX_VELOCITYX) {
               isFling = true;
            }
            // Log.i("byz", MAX_VELOCITYX + ", velocityX = " + velocityX);
            return super.onFling(e1, e2, velocityX, velocityY);
         }
      };
      mGestureDetector = new GestureDetectorCompat(getContext(),
            mGestureListener);

      // mScroller = ScrollerCompat.create(getContext(), new
      // BounceInterpolator());
      if (mCloseInterpolator != null) {
         mCloseScroller = ScrollerCompat.create(getContext(),
               mCloseInterpolator);
      } else {
         mCloseScroller = ScrollerCompat.create(getContext());
      }
      if (mOpenInterpolator != null) {
         mOpenScroller = ScrollerCompat.create(getContext(),
               mOpenInterpolator);
      } else {
         mOpenScroller = ScrollerCompat.create(getContext());
      }

      LayoutParams contentParams = new LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
      mContentView.setLayoutParams(contentParams);
      if (mContentView.getId() < 1) {
         mContentView.setId(CONTENT_VIEW_ID);
      }

      mMenuView.setId(MENU_VIEW_ID);
      mMenuView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));

      addView(mContentView);
      addView(mMenuView);

      // if (mContentView.getBackground() == null) {
      // mContentView.setBackgroundColor(Color.WHITE);
      // }

      // in android 2.x, MenuView height is MATCH_PARENT is not work.
      // getViewTreeObserver().addOnGlobalLayoutListener(
      // new OnGlobalLayoutListener() {
      // @Override
      // public void onGlobalLayout() {
      // setMenuHeight(mContentView.getHeight());
      // // getViewTreeObserver()
      // // .removeGlobalOnLayoutListener(this);
      // }
      // });

   }

   @Override
   protected void onAttachedToWindow() {
      super.onAttachedToWindow();
   }

   @Override
   protected void onSizeChanged(int w, int h, int oldw, int oldh) {
      super.onSizeChanged(w, h, oldw, oldh);
   }

   public boolean onSwipe(MotionEvent event) {
      mGestureDetector.onTouchEvent(event);
      switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
         mDownX = (int) event.getX();
         isFling = false;
         break;
      case MotionEvent.ACTION_MOVE:
         // Log.i("byz", "downX = " + mDownX + ", moveX = " + event.getX());
         int dis = (int) (mDownX - event.getX());
         if (state == STATE_OPEN) {
            dis += mMenuView.getWidth();
         }
         swipe(dis);
         break;
      case MotionEvent.ACTION_UP:
         if (isFling || (mDownX - event.getX()) > (mMenuView.getWidth() / 2)) {
            // open
            smoothOpenMenu();
         } else {
            // close
            smoothCloseMenu();
            return false;
         }
         break;
      }
      return true;
   }

   public boolean isOpen() {
      return state == STATE_OPEN;
   }

   @Override
   public boolean onTouchEvent(MotionEvent event) {
      return super.onTouchEvent(event);
   }

   private void swipe(int dis) {
      if (dis > mMenuView.getWidth()) {
         dis = mMenuView.getWidth();
      }
      if (dis < 0) {
         dis = 0;
      }
      mContentView.layout(-dis, mContentView.getTop(),
            mContentView.getWidth() - dis, getMeasuredHeight());
      mMenuView.layout(mContentView.getWidth() - dis, mMenuView.getTop(),
            mContentView.getWidth() + mMenuView.getWidth() - dis,
            mMenuView.getBottom());
   }

   @Override
   public void computeScroll() {
      if (state == STATE_OPEN) {
         if (mOpenScroller.computeScrollOffset()) {
            swipe(mOpenScroller.getCurrX());
            postInvalidate();
         }
      } else {
         if (mCloseScroller.computeScrollOffset()) {
            swipe(mBaseX - mCloseScroller.getCurrX());
            postInvalidate();
         }
      }
   }

   public void smoothCloseMenu() {
      state = STATE_CLOSE;
      mBaseX = -mContentView.getLeft();
      mCloseScroller.startScroll(0, 0, mBaseX, 0, 350);
      postInvalidate();
   }

   public void smoothOpenMenu() {
      state = STATE_OPEN;
      mOpenScroller.startScroll(-mContentView.getLeft(), 0,
            mMenuView.getWidth(), 0, 350);
      postInvalidate();
   }

   public void closeMenu() {
      if (mCloseScroller.computeScrollOffset()) {
         mCloseScroller.abortAnimation();
      }
      if (state == STATE_OPEN) {
         state = STATE_CLOSE;
         swipe(0);
      }
   }

   public void openMenu() {
      if (state == STATE_CLOSE) {
         state = STATE_OPEN;
         swipe(mMenuView.getWidth());
      }
   }

   public View getContentView() {
      return mContentView;
   }

   public SwipeMenuView getMenuView() {
      return mMenuView;
   }

   private int dp2px(int dp) {
      return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
            getContext().getResources().getDisplayMetrics());
   }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
      mMenuView.measure(MeasureSpec.makeMeasureSpec(0,
            MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(
            getMeasuredHeight(), MeasureSpec.EXACTLY));
   }

   @Override
   protected void onLayout(boolean changed, int l, int t, int r, int b) {
      mContentView.layout(0, 0, getMeasuredWidth(),
            mContentView.getMeasuredHeight());
      mMenuView.layout(getMeasuredWidth(), 0,
            getMeasuredWidth() + mMenuView.getMeasuredWidth(),
            mContentView.getMeasuredHeight());
      // setMenuHeight(mContentView.getMeasuredHeight());
      // bringChildToFront(mContentView);
   }

   public void setMenuHeight(int measuredHeight) {
      Log.i("byz", "pos = " + position + ", height = " + measuredHeight);
      LayoutParams params = (LayoutParams) mMenuView.getLayoutParams();
      if (params.height != measuredHeight) {
         params.height = measuredHeight;
         mMenuView.setLayoutParams(mMenuView.getLayoutParams());
      }
   }
}
SwipeMenuListView 代码如下:
import android.content.Context;
import android.support.v4.view.MotionEventCompat;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Interpolator;
import android.widget.ListAdapter;
import android.widget.ListView;

/**
 * 
 * @author baoyz
 * @date 2014-8-18
 * 
 */
public class SwipeMenuListView extends ListView {

   private static final int TOUCH_STATE_NONE = 0;
   private static final int TOUCH_STATE_X = 1;
   private static final int TOUCH_STATE_Y = 2;

   private int MAX_Y = 5;
   private int MAX_X = 3;
   private float mDownX;
   private float mDownY;
   private int mTouchState;
   private int mTouchPosition;
   private SwipeMenuLayout mTouchView;
   private OnSwipeListener mOnSwipeListener;

   private SwipeMenuCreator mMenuCreator;
   private OnMenuItemClickListener mOnMenuItemClickListener;
   private Interpolator mCloseInterpolator;
   private Interpolator mOpenInterpolator;

   public SwipeMenuListView(Context context) {
      super(context);
      init();
   }

   public SwipeMenuListView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      init();
   }

   public SwipeMenuListView(Context context, AttributeSet attrs) {
      super(context, attrs);
      init();
   }

   private void init() {
      MAX_X = dp2px(MAX_X);
      MAX_Y = dp2px(MAX_Y);
      mTouchState = TOUCH_STATE_NONE;
   }

   @Override
   public void setAdapter(ListAdapter adapter) {
      super.setAdapter(new SwipeMenuAdapter(getContext(), adapter) {
         @Override
         public void createMenu(SwipeMenu menu) {
            if (mMenuCreator != null) {
               mMenuCreator.create(menu);
            }
         }

         @Override
         public void onItemClick(SwipeMenuView view, SwipeMenu menu,
               int index) {
            if (mOnMenuItemClickListener != null) {
               mOnMenuItemClickListener.onMenuItemClick(
                     view.getPosition(), menu, index);
            }
            if (mTouchView != null) {
               mTouchView.smoothCloseMenu();
            }
         }
      });
   }

   public void setCloseInterpolator(Interpolator interpolator) {
      mCloseInterpolator = interpolator;
   }

   public void setOpenInterpolator(Interpolator interpolator) {
      mOpenInterpolator = interpolator;
   }

   public Interpolator getOpenInterpolator() {
      return mOpenInterpolator;
   }

   public Interpolator getCloseInterpolator() {
      return mCloseInterpolator;
   }

   @Override
   public boolean onInterceptTouchEvent(MotionEvent ev) {
      return super.onInterceptTouchEvent(ev);
   }

   @Override
   public boolean onTouchEvent(MotionEvent ev) {
      if (ev.getAction() != MotionEvent.ACTION_DOWN && mTouchView == null)
         return super.onTouchEvent(ev);
      int action = MotionEventCompat.getActionMasked(ev);
      action = ev.getAction();
      switch (action) {
      case MotionEvent.ACTION_DOWN:
         int oldPos = mTouchPosition;
         mDownX = ev.getX();
         mDownY = ev.getY();
         mTouchState = TOUCH_STATE_NONE;

         mTouchPosition = pointToPosition((int) ev.getX(), (int) ev.getY());

         if (mTouchPosition == oldPos && mTouchView != null
               && mTouchView.isOpen()) {
            mTouchState = TOUCH_STATE_X;
            mTouchView.onSwipe(ev);
            return true;
         }

         View view = getChildAt(mTouchPosition - getFirstVisiblePosition());

         if (mTouchView != null && mTouchView.isOpen()) {
            mTouchView.smoothCloseMenu();
            mTouchView = null;
            return super.onTouchEvent(ev);
         }
         if (view instanceof SwipeMenuLayout) {
            mTouchView = (SwipeMenuLayout) view;
         }
         if (mTouchView != null) {
            mTouchView.onSwipe(ev);
         }
         break;
      case MotionEvent.ACTION_MOVE:
         float dy = Math.abs((ev.getY() - mDownY));
         float dx = Math.abs((ev.getX() - mDownX));
         if (mTouchState == TOUCH_STATE_X) {
            if (mTouchView != null) {
               mTouchView.onSwipe(ev);
            }
            getSelector().setState(new int[] { 0 });
            ev.setAction(MotionEvent.ACTION_CANCEL);
            super.onTouchEvent(ev);
            return true;
         } else if (mTouchState == TOUCH_STATE_NONE) {
            if (Math.abs(dy) > MAX_Y) {
               mTouchState = TOUCH_STATE_Y;
            } else if (dx > MAX_X) {
               mTouchState = TOUCH_STATE_X;
               if (mOnSwipeListener != null) {
                  mOnSwipeListener.onSwipeStart(mTouchPosition);
               }
            }
         }
         break;
      case MotionEvent.ACTION_UP:
         if (mTouchState == TOUCH_STATE_X) {
            if (mTouchView != null) {
               mTouchView.onSwipe(ev);
               if (!mTouchView.isOpen()) {
                  mTouchPosition = -1;
                  mTouchView = null;
               }
            }
            if (mOnSwipeListener != null) {
               mOnSwipeListener.onSwipeEnd(mTouchPosition);
            }
            ev.setAction(MotionEvent.ACTION_CANCEL);
            super.onTouchEvent(ev);
            return true;
         }
         break;
      }
      return super.onTouchEvent(ev);
   }

   public void smoothOpenMenu(int position) {
      if (position >= getFirstVisiblePosition()
            && position <= getLastVisiblePosition()) {
         View view = getChildAt(position - getFirstVisiblePosition());
         if (view instanceof SwipeMenuLayout) {
            mTouchPosition = position;
            if (mTouchView != null && mTouchView.isOpen()) {
               mTouchView.smoothCloseMenu();
            }
            mTouchView = (SwipeMenuLayout) view;
            mTouchView.smoothOpenMenu();
         }
      }
   }

   private int dp2px(int dp) {
      return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
            getContext().getResources().getDisplayMetrics());
   }

   public void setMenuCreator(SwipeMenuCreator menuCreator) {
      this.mMenuCreator = menuCreator;
   }

   public void setOnMenuItemClickListener(
         OnMenuItemClickListener onMenuItemClickListener) {
      this.mOnMenuItemClickListener = onMenuItemClickListener;
   }

   public void setOnSwipeListener(OnSwipeListener onSwipeListener) {
      this.mOnSwipeListener = onSwipeListener;
   }

   public static interface OnMenuItemClickListener {
      void onMenuItemClick(int position, SwipeMenu menu, int index);
   }

   public static interface OnSwipeListener {
      void onSwipeStart(int position);

      void onSwipeEnd(int position);
   }
}
SwipeMenuView 代码如下:
import java.util.List;

import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * 
 * @author baoyz
 * @date 2014-8-23
 * 
 */
public class SwipeMenuView extends LinearLayout implements OnClickListener {

   private SwipeMenuListView mListView;
   private SwipeMenuLayout mLayout;
   private SwipeMenu mMenu;
   private OnSwipeItemClickListener onItemClickListener;
   private int position;

   public int getPosition() {
      return position;
   }

   public void setPosition(int position) {
      this.position = position;
   }

   public SwipeMenuView(SwipeMenu menu, SwipeMenuListView listView) {
      super(menu.getContext());
      mListView = listView;
      mMenu = menu;
      List<SwipeMenuItem> items = menu.getMenuItems();
      int id = 0;
      for (SwipeMenuItem item : items) {
         addItem(item, id++);
      }
   }

   private void addItem(SwipeMenuItem item, int id) {
      LayoutParams params = new LayoutParams(item.getWidth(),
            LayoutParams.MATCH_PARENT);
      LinearLayout parent = new LinearLayout(getContext());
      parent.setId(id);
      parent.setGravity(Gravity.CENTER);
      parent.setOrientation(LinearLayout.VERTICAL);
      parent.setLayoutParams(params);
      parent.setBackgroundDrawable(item.getBackground());
      parent.setOnClickListener(this);
      addView(parent);

      if (item.getIcon() != null) {
         parent.addView(createIcon(item));
      }
      if (!TextUtils.isEmpty(item.getTitle())) {
         parent.addView(createTitle(item));
      }

   }

   private ImageView createIcon(SwipeMenuItem item) {
      ImageView iv = new ImageView(getContext());
      iv.setImageDrawable(item.getIcon());
      return iv;
   }

   private TextView createTitle(SwipeMenuItem item) {
      TextView tv = new TextView(getContext());
      tv.setText(item.getTitle());
      tv.setGravity(Gravity.CENTER);
      tv.setTextSize(item.getTitleSize());
      tv.setTextColor(item.getTitleColor());
      return tv;
   }

   @Override
   public void onClick(View v) {
      if (onItemClickListener != null && mLayout.isOpen()) {
         onItemClickListener.onItemClick(this, mMenu, v.getId());
      }
   }

   public OnSwipeItemClickListener getOnSwipeItemClickListener() {
      return onItemClickListener;
   }

   public void setOnSwipeItemClickListener(OnSwipeItemClickListener onItemClickListener) {
      this.onItemClickListener = onItemClickListener;
   }

   public void setLayout(SwipeMenuLayout mLayout) {
      this.mLayout = mLayout;
   }

   public static interface OnSwipeItemClickListener {
      void onItemClick(SwipeMenuView view, SwipeMenu menu, int index);
   }
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值