国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android實現左滑刪除列表功能

2019-10-21 21:39:45
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android自定義左滑刪除列表的具體代碼,供大家參考,具體內容如下

1、布局文件view_left_slide_remove.xml

包含一個RelativeLayout和TextView,RelativeLayout是實際界面,TextView是刪除按鈕。

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="40dp">  <RelativeLayout    android:id="@+id/view_content"    android:layout_width="match_parent"    android:layout_height="match_parent" />  <TextView    android:id="@+id/tv_remove"    android:layout_width="@dimen/left_slide_remove_width"    android:layout_height="match_parent"    android:layout_alignParentRight="true"    android:gravity="center"    android:text="刪除"    android:textSize="16sp"    android:textColor="@color/white"    android:background="#ffff4b30"    android:visibility="gone"/></RelativeLayout>

2、自定義Adapter

LeftSlideRemoveAdapter類實現了BaseAdapter。
在getView方法中引用了view_left_slide_remove布局,提供getSubView來導入真正的布局。
OnItemRemoveListener是刪除監聽器。

public static abstract class LeftSlideRemoveAdapter extends BaseAdapter { protected Context mContext; private OnItemRemoveListener mListener;  public LeftSlideRemoveAdapter(Context context) { this.mContext = context; }  @Override public final View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) {  LayoutInflater inflater = LayoutInflater.from(mContext);  convertView = inflater.inflate(R.layout.view_left_slide_remove, parent, false);   holder = new ViewHolder();  holder.viewContent = (RelativeLayout) convertView.findViewById(R.id.view_content);  holder.tvRmove = (TextView) convertView.findViewById(R.id.tv_remove);  convertView.setTag(holder);   // viewChild是實際的界面  holder.viewChild = getSubView(position, null, parent);  holder.viewContent.addView(holder.viewChild); } else {  holder = (ViewHolder) convertView.getTag();  getSubView(position, holder.viewChild, parent); } holder.tvRmove.setOnClickListener(new View.OnClickListener(){  @Override  public void onClick(View v) {  if (mListener != null) {   mListener.onItemRemove(position);   notifyDataSetChanged();  }  } }); return convertView; }  public abstract View getSubView(int position, View convertView, ViewGroup parent);} private static class ViewHolder { RelativeLayout viewContent; View viewChild; View tvRmove;} public static interface OnItemRemoveListener { public void onItemRemove(int position);}

3、自定義左滑刪除列表

在dispatchTouchEvent方法里面捕捉MotionEvent事件。
在onTouchEvent方法里面滑動界面。
VelocityTracker類記錄手勢。
Scroller類進行滑動操作。

public class LeftSlideRemoveListView extends ListView {  private final static int SNAP_VELOCITY = 600;   private Scroller mScroller;  private VelocityTracker mVelocityTracker;   private int mTouchSlop;  private boolean mIsSlide = false;  private int mDelta = 0;  private int mDownX;  private int mDownY;  private int mMaxDistence;  private int mSlidePosition = INVALID_POSITION;  private OnItemRemoveListener adapterListener;   private OnItemRemoveListener mRemoveListener = new OnItemRemoveListener() {    @Override    public void onItemRemove(int position) {      if (adapterListener != null) {        adapterListener.onItemRemove(position);      }      clear();      mSlidePosition = INVALID_POSITION;    }  };  private LeftSlideRemoveAdapter mRemoveAdapter;   private View mCurrentContentView, mCurrentRemoveView;   public LeftSlideRemoveListView(Context context) {    this(context, null);  }   public LeftSlideRemoveListView(Context context, AttributeSet attrs) {    super(context, attrs);     mScroller = new Scroller(context);    mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();     mMaxDistence = context.getResources().getDimensionPixelSize(        R.dimen.left_slide_remove_width);  }   @Override  public boolean dispatchTouchEvent(MotionEvent ev) {    switch (ev.getAction()) {      case MotionEvent.ACTION_DOWN:        addVelocityTracker(ev);         if (!mScroller.isFinished()) {          return super.dispatchTouchEvent(ev);        }        // 起始位置,當前position        mDownX = (int) ev.getX();        mDownY = (int) ev.getY();        int position = pointToPosition(mDownX, mDownY);        if (position == mSlidePosition) break;         mSlidePosition = position;         if (mSlidePosition == INVALID_POSITION ) {          return super.dispatchTouchEvent(ev);        }         // 恢復狀態        clear();         // 獲取當前界面        View childView = getChildAt(mSlidePosition - getFirstVisiblePosition());        mCurrentContentView = childView.findViewById(R.id.view_content);        mCurrentRemoveView = childView.findViewById(R.id.tv_remove);         break;      case MotionEvent.ACTION_MOVE:        if (mCurrentContentView == null) break;         if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY            || (Math.abs(ev.getX() - mDownX) > mTouchSlop            && Math.abs(ev.getY() - mDownY) < mTouchSlop)) {          // 開始滑動          mIsSlide = true;        }        break;      case MotionEvent.ACTION_UP:        if (mCurrentContentView == null && mIsSlide) break;         // 如果左滑小于4/5,按鈕不顯示        if (mDelta < mMaxDistence * 4 / 5) {          mCurrentRemoveView.setVisibility(View.GONE);          scrollRight();        } else if (mDelta < mMaxDistence) {          scrollLeft();        }        recycleVelocityTracker();        mIsSlide = false;        break;    }     return super.dispatchTouchEvent(ev);  }   @Override  public boolean onTouchEvent(MotionEvent ev) {    if (mIsSlide && mSlidePosition != INVALID_POSITION) {      final int action = ev.getAction();      int x = (int) ev.getX();      switch (action) {        case MotionEvent.ACTION_MOVE:          addVelocityTracker(ev);           int deltaX = mDownX - x;          mDownX = x;           mDelta += deltaX;           if (mDelta < 0) {            mCurrentContentView.scrollTo(0, 0);             mDelta = 0;            mCurrentRemoveView.setVisibility(View.GONE);          } else if (mDelta >= mMaxDistence) {            mDelta = mMaxDistence;            mCurrentContentView.scrollTo(mMaxDistence, 0);            mCurrentRemoveView.setVisibility(View.VISIBLE);            mCurrentRemoveView.setTranslationX(0);          } else {            mCurrentContentView.scrollBy(deltaX, 0);            mCurrentRemoveView.setVisibility(View.VISIBLE);            mCurrentRemoveView.setTranslationX(mMaxDistence - mDelta);          }          break;      }      return true;    }    return super.onTouchEvent(ev);  }   // 右滑  private void scrollRight() {    final int delta = mDelta;    mScroller.startScroll(delta, 0, -delta, 0, Math.abs(delta));    mDelta = 0;    postInvalidate();  }   // 左滑  private void scrollLeft() {    final int delta = mMaxDistence - mDelta;    mScroller.startScroll(mDelta, 0, delta, 0, Math.abs(delta));    mDelta = mMaxDistence;    postInvalidate();  }   @Override  public void computeScroll() {    if (mScroller.computeScrollOffset()) {      mCurrentContentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());      mCurrentRemoveView.setTranslationX(mMaxDistence - mScroller.getCurrX());       postInvalidate();       if (mScroller.isFinished()) {        mCurrentContentView.scrollTo(mDelta, 0);        mCurrentRemoveView.setTranslationX(0);      }    }  }   private void addVelocityTracker(MotionEvent event) {    if (mVelocityTracker == null) {      mVelocityTracker = VelocityTracker.obtain();    }     mVelocityTracker.addMovement(event);  }   private int getScrollVelocity() {    mVelocityTracker.computeCurrentVelocity(1000);    int velocity = (int) mVelocityTracker.getXVelocity();    return velocity;  }   private void recycleVelocityTracker() {    if (mVelocityTracker != null) {      mVelocityTracker.recycle();      mVelocityTracker = null;    }  }   private void clear() {    if (mCurrentContentView != null) {      mDelta = 0;      mCurrentContentView.scrollTo(0, 0);      mCurrentContentView = null;       mCurrentRemoveView.setVisibility(View.GONE);      mCurrentRemoveView = null;    }  }   @Override  public void setAdapter(ListAdapter adapter) {    if (adapter instanceof LeftSlideRemoveAdapter) {      super.setAdapter(adapter);       mRemoveAdapter = (LeftSlideRemoveAdapter) adapter;      mRemoveAdapter.mListener = mRemoveListener;    } else {      throw new IllegalArgumentException("Must be LeftSlideRemoveAdapter");    }  }   public void setOnItemRemoveListener(OnItemRemoveListener listener) {    adapterListener = listener;  }}

4、測試例子

ContractAdapter繼承LeftSlideRemoveAdapter類。
LeftSlideRemoveActivity中使用LeftSlideRemoveListView類。

public class LeftSlideRemoveActivity extends Activity {  private List<Map<String, String>> mContentList = new ArrayList<Map<String, String>>();   @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);     setContentView(R.layout.activity_left_slide_remove);     Map<String, String> item = new HashMap<String, String>();    item.put("name", "Peter");    item.put("address", "ShangHai");    mContentList.add(item);     item = new HashMap<String, String>();    item.put("name", "Lily");    item.put("address", "BeiJing");    mContentList.add(item);     item = new HashMap<String, String>();    item.put("name", "Jack");    item.put("address", "GuangZhou");    mContentList.add(item);     item = new HashMap<String, String>();    item.put("name", "Mike");    item.put("address", "ShengZhen");    mContentList.add(item);     LeftSlideRemoveListView lv = (LeftSlideRemoveListView) findViewById(R.id.id_listview);    lv.setAdapter(new ContractAdapter(this));    lv.setOnItemRemoveListener(new LeftSlideRemoveListView.OnItemRemoveListener() {      @Override      public void onItemRemove(int position) {        mContentList.remove(position);      }    });  }   private class ContractAdapter extends LeftSlideRemoveListView.LeftSlideRemoveAdapter {     public ContractAdapter(Context context) {      super(context);    }     @Override    public int getCount() {      return mContentList.size();    }     @Override    public Object getItem(int position) {      return position;    }     @Override    public long getItemId(int position) {      return position;    }     @Override    public View getSubView(int position, View convertView, ViewGroup parent) {      ViewHolder holder;      if (convertView == null) {        convertView = getLayoutInflater().inflate(            R.layout.listview_item_customdapter, parent, false);        holder = new ViewHolder();        holder.tvName = (TextView) convertView.findViewById(R.id.tv_name);        holder.tvAddress = (TextView) convertView.findViewById(R.id.tv_address);         convertView.setTag(holder);      } else {        holder = (ViewHolder) convertView.getTag();      }      Map<String, String> itemData = mContentList.get(position);      holder.tvName.setText(itemData.get("name"));      holder.tvAddress.setText(itemData.get("address"));       return convertView;    }  }   private class ViewHolder {    TextView tvName;    TextView tvAddress;  } }

顯示如下

Android,左滑刪除

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 全椒县| 环江| 牟定县| 九寨沟县| 凌海市| 太保市| 青海省| 融水| 博爱县| 黄浦区| 邹城市| 白水县| 临澧县| 綦江县| 班玛县| 巩留县| 聂拉木县| 申扎县| 武威市| 甘泉县| 汉川市| 安吉县| 乌拉特前旗| 额尔古纳市| 普洱| 正蓝旗| 灵川县| 元谋县| 达日县| 舒兰市| 左权县| 藁城市| 定日县| 阜城县| 澄城县| 灌南县| 成都市| 溧水县| 英吉沙县| 武乡县| 房产|