1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      怎么在Android中實(shí)現(xiàn)一個(gè)左滑刪除列表功能

      怎么在Android中實(shí)現(xiàn)一個(gè)左滑刪除列表功能?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

      巴州ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!

      1、布局文件view_left_slide_remove.xml

      包含一個(gè)RelativeLayout和TextView,RelativeLayout是實(shí)際界面,TextView是刪除按鈕。

      
      
        
        
      

      2、自定義Adapter

      LeftSlideRemoveAdapter類實(shí)現(xiàn)了BaseAdapter。
      在getView方法中引用了view_left_slide_remove布局,提供getSubView來(lái)導(dǎo)入真正的布局。
      OnItemRemoveListener是刪除監(jiān)聽(tīng)器。

      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是實(shí)際的界面
        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方法里面滑動(dòng)界面。
      VelocityTracker類記錄手勢(shì)。
      Scroller類進(jìn)行滑動(dòng)操作。

      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);
              }
              // 起始位置,當(dāng)前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);
              }
       
              // 恢復(fù)狀態(tài)
              clear();
       
              // 獲取當(dāng)前界面
              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)) {
                // 開(kāi)始滑動(dòng)
                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、測(cè)試?yán)?/strong>

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

      public class LeftSlideRemoveActivity extends Activity {
        private List> mContentList = new ArrayList>();
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
       
          setContentView(R.layout.activity_left_slide_remove);
       
          Map item = new HashMap();
          item.put("name", "Peter");
          item.put("address", "ShangHai");
          mContentList.add(item);
       
          item = new HashMap();
          item.put("name", "Lily");
          item.put("address", "BeiJing");
          mContentList.add(item);
       
          item = new HashMap();
          item.put("name", "Jack");
          item.put("address", "GuangZhou");
          mContentList.add(item);
       
          item = new HashMap();
          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 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;
        }
       
      }

      關(guān)于怎么在Android中實(shí)現(xiàn)一個(gè)左滑刪除列表功能問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


      本文標(biāo)題:怎么在Android中實(shí)現(xiàn)一個(gè)左滑刪除列表功能
      本文網(wǎng)址:http://www.ef60e0e.cn/article/ipoihe.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
        1. <ul id="0c1fb"></ul>

          <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
          <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

          周口市| 黎平县| 通江县| 方城县| 读书| 东丽区| 通榆县| 中阳县| 修武县| 洛宁县| 锦屏县| 璧山县| 泰来县| 巩留县| 长岛县| 德令哈市| 凤翔县| 洛南县| 白城市| 曲水县| 琼中| 达孜县| 泰宁县| 肥西县| 松滋市| 灌南县| 南乐县| 霞浦县| 广汉市| 伽师县| 辉南县| 香港 | 和平区| 尼勒克县| 芮城县| 托克逊县| 无极县| 工布江达县| 皮山县| 平塘县| 城口县|