ListView和ExpandableListView的侧滑删除操作

本案例主要实现了ListViewExpandableListView的侧滑删除操作功能

效果图:


         

代码:

自定义ListView
public class ZQListView extends ListView {
 
   private static final String TAG ="ZQListView ";
 
   private ZQView mFocusedItemView;
 
   float mX = 0;
   float mY = 0;
   private int mPosition = -1;
   boolean isSlider = false;
 
   public ZQListView(Contextcontext) {
      super(context);
   }
 
   public ZQListView(Contextcontext, AttributeSet attrs) {
      super(context,attrs);
   }
 
   public ZQListView(Contextcontext, AttributeSet attrs,int defStyle) {
      super(context,attrs, defStyle);
   }
 
   @Override
   public boolean onTouchEvent(MotionEvent event) {
      float x =event.getX();
      float y =event.getY();
      switch(event.getAction()) {
      case MotionEvent.ACTION_DOWN:
         isSlider = false;
         mX = x;
         mY = y;
         int position= pointToPosition((int) x, (int) y);
         if (mPosition !=position) {
            mPosition =position;
            if (mFocusedItemView !=null) {
                mFocusedItemView.reset();
            }
         }
         break;
      case MotionEvent.ACTION_MOVE:
         if (mPosition != -1) {
            if (Math.abs(mY - y) <30 && Math.abs(mX - x) > 20) {
                int first =this.getFirstVisiblePosition();
                int index =mPosition - first;
                mFocusedItemView =(ZQView) getChildAt(index);
                mFocusedItemView.onTouchEvent(event);
                isSlider = true;
                return true;
            }
         }
         break;
      case MotionEvent.ACTION_UP:
         if (isSlider) {
            isSlider = false;
            if (mFocusedItemView !=null) {
                mFocusedItemView.adjust(mX - x >0);
                return true;
            }
         }
         break;
      }
      return super.onTouchEvent(event);
   }
}
侧滑布局类
public class ZQView extends LinearLayout {
   private static final String TAG ="SlideView";
   private static final int TAN = 2;
   private int mHolderWidth = 120;
   private float mLastX = 0;
   private float mLastY = 0;
   private Context mContext;
   private LinearLayout mViewContent;
   private Scroller mScroller;
 
   public ZQView(Contextcontext, Resources resources) {
      super(context);
      initView();
   }
 
   public ZQView(Contextcontext) {
      super(context);
      initView();
   }
 
   public ZQView(Contextcontext, AttributeSet attrs) {
      super(context,attrs);
      initView();
   }
 
   private void initView() {
      setOrientation(LinearLayout.HORIZONTAL);
      mContext = getContext();
      mScroller = new Scroller(mContext);
      View.inflate(mContext,R.layout.delete_view,this);
      mViewContent = (LinearLayout)findViewById(R.id.view_content);
      mHolderWidth = Math.round(TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,mHolderWidth,getResources()
                   .getDisplayMetrics()));
   }
 
   public void setContentView(View view) {
      mViewContent.addView(view);
   }
 
   public void shrink(){
      int offset =getScrollX();
      if (offset== 0) {
         return;
      }
      scrollTo(0, 0);
   }
 
   public void reset() {
      int offset =getScrollX();
      if (offset== 0) {
         return;
      }
      smoothScrollTo(0, 0);
   }
 
   public void adjust(boolean left) {
      int offset =getScrollX();
      if (offset== 0) {
         return;
      }
      if (offset< 20) {
         this.smoothScrollTo(0,0);
      } else if (offset< mHolderWidth - 20) {
         if (left) {
            this.smoothScrollTo(mHolderWidth, 0);
         } else {
            this.smoothScrollTo(0,0);
         }
      } else {
         this.smoothScrollTo(mHolderWidth, 0);
      }
   }
 
   @Override
   public boolean onTouchEvent(MotionEvent event) {
      switch(event.getAction()) {
      case MotionEvent.ACTION_MOVE:
         float x =event.getX();
         float y =event.getY();
         float deltaX =x -mLastX;
         float delatY =y -mLastY;
         mLastX = x;
         mLastY = y;
         if (Math.abs(deltaX)< Math.abs(delatY) *TAN) {
            break;
         }
         if (deltaX!= 0) {
            float newScrollX = getScrollX() - deltaX;
            if(newScrollX < 0) {
                newScrollX = 0;
            } else if(newScrollX > mHolderWidth) {
                newScrollX = mHolderWidth;
            }
            this.scrollTo((int)newScrollX, 0);
         }
         break;
      }
      return super.onTouchEvent(event);
   }
 
   private void smoothScrollTo(int destX,int destY) {
      int scrollX =getScrollX();
      int delta =destX - scrollX;
      mScroller.startScroll(scrollX,0, delta, 0, Math.abs(delta) * 3);
      invalidate();
   }
 
   @Override
   public void computeScroll() {
      if (mScroller.computeScrollOffset()){
         scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
         postInvalidate();
      }
   }



布局文件

delete.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:Android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <LinearLayout
        android:id="@+id/view_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
    </LinearLayout>
 
    <RelativeLayout
        android:id="@+id/holder"
        android:layout_width="120dp"
        android:layout_height="match_parent"
        android:background="@drawable/holder_bg"
        android:clickable="true">
 
        <TextView
            android:id="@+id/delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:drawableLeft="@drawable/del_icon_normal"
            android:gravity="center"
            android:text="删除"
            android:textColor="@color/floralwhite"/>
    </RelativeLayout>
 
</merge>


listview.xml
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <com.example.util.ZQListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff4f7f9"
        android:cacheColorHint="#00000000"
        android:divider="#6c6c6c"
        android:dividerHeight="1dp"
        android:drawSelectorOnTop="false"
        android:listSelector="#00000000"
        android:scrollbars="none"
        android:scrollingCache="false"/>
 
</LinearLayout>



Activity和适配器类
public class ActivityListViewDelete extends Activity implements
      OnItemClickListener, OnClickListener {
 
   private ZQListView mListView;
 
   private List<MessageItem> mMessageItems = new ArrayList<ActivityListViewDelete.MessageItem>();
 
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      initView();
   }
 
   public static int[] Img = {R.drawable.ssdk_oks_classic_qq,
         R.drawable.ssdk_oks_classic_qzone,
         R.drawable.ssdk_oks_classic_shortmessage,
         R.drawable.ssdk_oks_classic_sinaweibo,
         R.drawable.ssdk_oks_classic_tencentweibo,
         R.drawable.ssdk_oks_classic_vkontakte,
         R.drawable.ssdk_oks_classic_wechat,
         R.drawable.ssdk_oks_classic_wechatfavorite,
         R.drawable.ssdk_oks_classic_wechatmoments,
         R.drawable.ssdk_oks_classic_yixinmoments };
 
   private void initView() {
      mListView = (ZQListView)findViewById(R.id.list);
      int length = Img.length;
      for (int i = 0; i< length; i++) {
         MessageItem item = new MessageItem();
         item.iconRes = Img[i];
         item.title = "标题" + (i + 1);
         item.msg = "消息" + (i + 1);
         item.time = "2016-6-1" + i;
         mMessageItems.add(item);
      }
      mListView.setAdapter(newSlideAdapter());
      mListView.setOnItemClickListener(this);
   }
 
   private class SlideAdapter extends BaseAdapter {
 
      private LayoutInflater mInflater;
 
      SlideAdapter() {
         super();
         mInflater =getLayoutInflater();
      }
 
      @Override
      public int getCount() {
         return mMessageItems.size();
      }
 
      @Override
      public Object getItem(int position) {
         return mMessageItems.get(position);
      }
 
      @Override
      public long getItemId(int position) {
         return position;
      }
 
      @Override
      public View getView(int position, View convertView, ViewGroupparent) {
         ViewHolder holder;
         ZQView slideView = (ZQView)convertView;
         if(slideView == null) {
            View itemView = mInflater.inflate(R.layout.list_item,null);
 
            slideView = newZQView(ActivityListViewDelete.this);
            slideView.setContentView(itemView);
            holder = newViewHolder(slideView);
            slideView.setTag(holder);
         } else {
            holder = (ViewHolder) slideView.getTag();
         }
         MessageItem item = mMessageItems.get(position);
         slideView.shrink();
         holder.icon.setImageResource(item.iconRes);
         holder.title.setText(item.title);
         holder.time.setText(item.time);
         holder.deleteHolder.setOnClickListener(ActivityListViewDelete.this);
 
         return slideView;
      }
 
   }
 
   public class MessageItem {
      public int iconRes;
      public String title;
      public String msg;
      public String time;
   }
 
   private static class ViewHolder {
      public ImageViewicon;
      public TextView title;
      public TextView time;
      public ViewGroup deleteHolder;
 
      ViewHolder(View view) {
         icon =(ImageView) view.findViewById(R.id.icon);
         title =(TextView) view.findViewById(R.id.title);
         time =(TextView) view.findViewById(R.id.time);
         deleteHolder =(ViewGroup) view.findViewById(R.id.holder);
      }
   }
 
   @Override
   public void onItemClick(AdapterView<?> parent, View view, int position,
         long id) {
      Toast.makeText(this,"onItemClickposition=" + position, 1).show();
 
   }
 
   @Override
   public void onClick(View v) {
      if(v.getId() == R.id.holder) {
         Toast.makeText(this,"删除操作",1).show();

      }
   }
 
}



此代码是ListView的侧滑删除操作,ExpandableListView未贴出来,下载代码即可,两个都有。

 

源码下载:

 

(注:ExpandableListView的侧滑删除有点错误)

Eclipse下载:http://download.csdn.net/detail/dickyqie/9627652

AndroidStudio下载:https://github.com/DickyQie/ListViewExpandableListViewDelete

 

 

 

 

猜你喜欢

转载自zhangqie.iteye.com/blog/2365780