listview側滑刪除

先上MainActivityjava

package com.example.main;

import android.app.Activity;
import android.widget.ListView;

import com.example.adapter.SwipeAdapter;
import com.example.helloworld.R;
import com.example.view.SwipeListView;

public class FragmentTestActivity extends Activity {
   
   private SwipeListView lv = null;
   protected void onCreate(android.os.Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.frame_test);
      
      lv = (SwipeListView)findViewById(R.id.lv);
      
      SwipeAdapter adapter = new SwipeAdapter(this);
      lv.setAdapter(adapter);
   }
}

 

接下來上一個正式數據和一個側滑出來的數據的xmlandroid

test02--側滑後的數據app

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="測試數據"/>
</LinearLayout>

test01數據框架

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
   <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="測試數據"/>
</LinearLayout>

接下來是ide

frame_test佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <com.xinnonbao.cehuaaaaaaaaaaaaaaa.SwipeListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv">

    </com.xinnonbao.cehuaaaaaaaaaaaaaaa.SwipeListView>
</LinearLayout>

下面是能夠直接拷貝做爲工具類的四個工具

第一個------------------佈局

package com.xinnonbao.cehuaaaaaaaaaaaaaaa;

import android.app.Activity;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public final class Interpretor {
   private final Activity mActivity;

   private Interpretor(Activity activity) {
      mActivity = activity;
   }

   /**
    * Gets an {@link Interpretor} capable of injecting fields for the given
    * Activity.
    */
   public static Interpretor get(Activity activity) {
      return new Interpretor(activity);
   }

   /**
    * Injects all fields that are marked with the {@link InterpretView}
    * annotation.
    * <p>
    * For each field marked with the InjectView annotation, a call to
    * {@link Activity#findViewById(int)} will be made, passing in the resource
    * id stored in the value() method of the InjectView annotation as the int
    * parameter, and the result of this call will be assigned to the field.
    * 
    * @throws IllegalStateException
    *             if injection fails, common causes being that you have used an
    *             invalid id value, or you haven't called setContentView() on
    *             your Activity.
    */
   public void inject() {
      for (Field field : mActivity.getClass().getDeclaredFields()) {
         for (Annotation annotation : field.getAnnotations()) {
            if (annotation.annotationType().equals(InterpretView.class)) {
               try {
                  Class<?> fieldType = field.getType();
                  int idValue = InterpretView.class.cast(annotation).value();
                  field.setAccessible(true);
                  Object injectedValue = fieldType.cast(mActivity
                        .findViewById(idValue));
                  if (injectedValue == null) {
                     throw new IllegalStateException("findViewById("
                           + idValue + ") gave null for " + field
                           + ", can't inject");
                  }
                  field.set(mActivity, injectedValue);
                  field.setAccessible(false);
               } catch (IllegalAccessException e) {
                  throw new IllegalStateException(e);
               }
            }
         }
      }
   }
}

 

第二個----------------------post

package com.xinnonbao.cehuaaaaaaaaaaaaaaa;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface InterpretView {
   public int value();
}

 

第三個測試

package com.xinnonbao.cehuaaaaaaaaaaaaaaa;

import android.support.v4.widget.ScrollerCompat;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Interpolator;
import android.widget.AbsListView;
import android.widget.FrameLayout;


public class SwipeItemLayout extends FrameLayout {
   private View contentView = null;
   private View menuView = null;
   private Interpolator closeInterpolator = null;
   private Interpolator openInterpolator = null;
   
   private ScrollerCompat mOpenScroller;
   private ScrollerCompat mCloseScroller;
   
   private int mBaseX;
   private int mDownX;
   private int state = STATE_CLOSE;
   
   private static final int STATE_CLOSE = 0;
   private static final int STATE_OPEN = 1;
   
   public SwipeItemLayout(View contentView,View menuView,Interpolator closeInterpolator, Interpolator openInterpolator){
      super(contentView.getContext());
      this.contentView = contentView;
      this.menuView = menuView;
      this.closeInterpolator = closeInterpolator;
      this.openInterpolator = openInterpolator;
      
      init();
   }
   
   private void init(){
      setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.WRAP_CONTENT));

      if (closeInterpolator != null) {
         mCloseScroller = ScrollerCompat.create(getContext(),
               closeInterpolator);
      } else {
         mCloseScroller = ScrollerCompat.create(getContext());
      }
      if (openInterpolator != null) {
         mOpenScroller = ScrollerCompat.create(getContext(),
               openInterpolator);
      } else {
         mOpenScroller = ScrollerCompat.create(getContext());
      }
      
      LayoutParams contentParams = new LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
      contentView.setLayoutParams(contentParams);

      menuView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));

      addView(contentView);
      addView(menuView);
   }
   
   public boolean onSwipe(MotionEvent event) {
      switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
         mDownX = (int) event.getX();
         break;
      case MotionEvent.ACTION_MOVE:
         // Log.i("byz", "downX = " + mDownX + ", moveX = " + event.getX());
         int dis = (int) (mDownX - event.getX());
         if (state == STATE_OPEN) {
            dis += menuView.getWidth();
         }
         swipe(dis);
         break;
      case MotionEvent.ACTION_UP:
         if ((mDownX - event.getX()) > (menuView.getWidth() / 2)) {
            // open
            smoothOpenMenu();
         } else {
            // close
            smoothCloseMenu();
            return false;
         }
         break;
      }
      return true;
   }
   
   public boolean isOpen() {
      return state == STATE_OPEN;
   }
   
   private void swipe(int dis) {
      if (dis > menuView.getWidth()) {
         dis = menuView.getWidth();
      }
      if (dis < 0) {
         dis = 0;
      }
      contentView.layout(-dis, contentView.getTop(),
            contentView.getWidth() - dis, getMeasuredHeight());
      menuView.layout(contentView.getWidth() - dis, menuView.getTop(),
            contentView.getWidth() + menuView.getWidth() - dis,
            menuView.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 = -contentView.getLeft();
      System.out.println(mBaseX);
      mCloseScroller.startScroll(0, 0, mBaseX, 0, 350);
      postInvalidate();
   }
   
   public void smoothOpenMenu() {
      state = STATE_OPEN;
      mOpenScroller.startScroll(-contentView.getLeft(), 0,
            menuView.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(menuView.getWidth());
      }
   }

   public View getContentView() {
      return contentView;
   }

   public View getMenuView() {
      return menuView;
   }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
      menuView.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) {
      contentView.layout(0, 0, getMeasuredWidth(),
            contentView.getMeasuredHeight());
      menuView.layout(getMeasuredWidth(), 0,
            getMeasuredWidth() + menuView.getMeasuredWidth(),
            contentView.getMeasuredHeight());
      // setMenuHeight(mContentView.getMeasuredHeight());
      // bringChildToFront(mContentView);
   }
}

 

第四個this

package com.xinnonbao.cehuaaaaaaaaaaaaaaa;

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.ListView;

public class SwipeListView 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 SwipeItemLayout mTouchView;
// private OnSwipeListener mOnSwipeListener;

// private OnMenuItemClickListener mOnMenuItemClickListener;
   private Interpolator mCloseInterpolator;
   private Interpolator mOpenInterpolator;

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

   public SwipeListView(Context context, AttributeSet attrs) {
      super(context, attrs);
      // TODO Auto-generated constructor stub
      init();
   }

   public SwipeListView(Context context) {
      super(context);
      // TODO Auto-generated constructor stub
      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 SwipeItemLayout) {
            mTouchView = (SwipeItemLayout) 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 SwipeItemLayout) {
            mTouchPosition = position;
            if (mTouchView != null && mTouchView.isOpen()) {
               mTouchView.smoothCloseMenu();
            }
            mTouchView = (SwipeItemLayout) view;
            mTouchView.smoothOpenMenu();
         }
      }
   }

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


// 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);
// }
}

 

最後面是adapter了

package com.xinnonbao.cehuaaaaaaaaaaaaaaa;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;

public class SwipeAdapter extends BaseAdapter {
   private Context mContext = null;
   
   public SwipeAdapter(Context context) {
      this.mContext = context;
   }

   @Override
   public int getCount() {
      // TODO Auto-generated method stub
      return 10;
   }

   @Override
   public Object getItem(int arg0) {
      // TODO Auto-generated method stub
      return null;
   }

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

   @Override
   public View getView(int position, View contentView, ViewGroup arg2) {
      ViewHolder holder = null;
      if(contentView==null){
         holder = new ViewHolder();
         View view01 = LayoutInflater.from(mContext).inflate(R.layout.test01, null);
         View view02 = LayoutInflater.from(mContext).inflate(R.layout.test2, null);

//       holder.btn = (Button)view02.findViewById(R.id.btn);
         contentView = new SwipeItemLayout(view01, view02, null, null);

         contentView.setTag(holder);
         if(view02.getVisibility()==View.VISIBLE){
            Button viewById = (Button) view02.findViewById(R.id.delete_tutton);
            viewById.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View view) {
                  Log.e("viewById","這裏就是點擊事件了");

               }
            });
         }
      }else{
         holder = (ViewHolder) contentView.getTag();
      }
      
//    holder.btn.setOnClickListener(new OnClickListener() {
//
//       @Override
//       public void onClick(View arg0) {
//          // TODO Auto-generated method stub
//          Toast.makeText(mContext, "click", Toast.LENGTH_LONG).show();
//       }
//    });
      return contentView;
   }
   
   class ViewHolder{
      Button btn = null;
   }
}

 

OK基本完成

 

網上還有另外的框架

http://m.blog.csdn.net/article/details?id=50505210
相關文章
相關標籤/搜索