亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android仿微信實現左滑顯示刪除按鈕功能

2019-10-21 21:36:19
字體:
來源:轉載
供稿:網友

在實際項目中刪除列表中的某一項是非常常見的功能,傳統的做法可以使用長按監聽器等,而現在流行的做法是左滑彈出刪除按鈕,微信,QQ等都是這么做的,下面做一個示例,代碼如下:

主頁面MainActivity:代碼比較簡單常規

package com.home.testslideview; import java.util.ArrayList;import java.util.List; import android.app.Activity;import android.os.Bundle;import android.widget.ListView; import com.home.textslideview.R; public class MainActivity extends Activity {  private ListView listView;  private List<NewInfoBean> list = new ArrayList<NewInfoBean>();  // 適配器 private SlideAdapter adapter;  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initView(); initData(); setAdapter(); }  /** * 初始化頁面控件 */ private void initView() { listView = (ListView) findViewById(R.id.main_lv); }  /** * 初始化數據 */ private void initData() { list.add(new NewInfoBean("這是測試內容1")); list.add(new NewInfoBean("這是測試內容2")); list.add(new NewInfoBean("這是測試內容3")); list.add(new NewInfoBean("這是測試內容4")); list.add(new NewInfoBean("這是測試內容5")); list.add(new NewInfoBean("這是測試內容6")); list.add(new NewInfoBean("這是測試內容7")); list.add(new NewInfoBean("這是測試內容8")); list.add(new NewInfoBean("這是測試內容9")); list.add(new NewInfoBean("這是測試內容10")); }  /** * 設置適配器 */ private void setAdapter() { if (adapter == null) { adapter = new SlideAdapter(this, list); listView.setAdapter(adapter); } else { adapter.setList(list); adapter.notifyDataSetChanged(); } } }

實體類NewInfoBean:具體項目中由自己定義:

package com.home.testslideview; public class NewInfoBean { public SlideView slideView;  private String content;  public SlideView getSlideView() { return slideView; }  public void setSlideView(SlideView slideView) { this.slideView = slideView; }  public String getContent() { return content; }  public void setContent(String content) { this.content = content; }  public NewInfoBean() { super(); }  public NewInfoBean(String content) { super(); this.content = content; } }

適配器SlideAdapter:也比較簡單

package com.home.testslideview; import java.util.List; import android.content.Context;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView; import com.home.testslideview.SlideView.OnSlideListener;import com.home.textslideview.R; public class SlideAdapter extends BaseAdapter implements OnSlideListener, OnClickListener {  private LayoutInflater inflater;  private List<NewInfoBean> list;  private Context context;  public SlideAdapter(Context context, List<NewInfoBean> list) { if (inflater == null) { inflater = LayoutInflater.from(context); } this.list = list; this.context = context; }  @Override public int getCount() { return list.size(); }  @Override public Object getItem(int position) { return list.get(position); }  @Override public long getItemId(int position) { return position; }  @Override public View getView(int position, View convertView, ViewGroup arg2) {  SlideView slideView = (SlideView) convertView; NewInfoBean bean = list.get(position); if (slideView == null) { slideView = new SlideView(context); slideView.setOnSlideListener(this); }  // 設置內容 TextView contentText = getAdapterView(slideView, R.id.slideview_tv_content, position); contentText.setText(bean.getContent());  // 刪除按鈕 TextView delText = getAdapterView(slideView, R.id.slideview_tv_del, position); delText.setOnClickListener(this);  bean.slideView = slideView; bean.slideView.shrink();  return slideView; }  @SuppressWarnings("unchecked") public <T extends View> T getAdapterView(View convertView, int id, Object tag) { SparseArray<View> viewHolder = null; try { if (convertView.getTag(R.id.view_holder) instanceof SparseArray<?>) { viewHolder = (SparseArray<View>) convertView  .getTag(R.id.view_holder); } } catch (ClassCastException e) { } if (viewHolder == null) { viewHolder = new SparseArray<View>(); convertView.setTag(R.id.view_holder, viewHolder); convertView.setTag(R.id.order_id, tag); } View childView = viewHolder.get(id); if (childView == null) { childView = convertView.findViewById(id); childView.setTag(tag); viewHolder.put(id, childView); } return (T) childView; }  public List<NewInfoBean> getList() { return list; }  public void setList(List<NewInfoBean> list) { this.list = list; }  @Override public void onSlide(View view, int status) { }  @Override public void onClick(View v) { switch (v.getId()) { case R.id.slideview_tv_del: int position = (Integer) v.getTag(); list.remove(position); notifyDataSetChanged(); break;  default: break; } } }

比較關鍵的兩個類:

自定義的ListView:SlideListView

 

package com.home.testslideview; import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.ListView; public class SlideListView extends ListView {  private SlideView itemView;  public SlideListView(Context context) { super(context); }  public SlideListView(Context context, AttributeSet attrs) { super(context, attrs); }  public void shrinkListItem(int position) { View item = getChildAt(position); if (item != null) { try { ((SlideView) item).shrink(); } catch (ClassCastException e) { e.printStackTrace(); } } }  @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { int x = (int) event.getX(); int y = (int) event.getY(); int position = pointToPosition(x, y); if (position != INVALID_POSITION) { NewInfoBean data = (NewInfoBean) getItemAtPosition(position); itemView = data.slideView; } } default: break; }  if (itemView != null) { itemView.onRequireTouchEvent(event); }  return super.onTouchEvent(event); } }

自定義的ListView中的每一行控件:SlideView(借鑒網上的一個示例):

package com.home.testslideview; import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;import android.widget.Scroller; import com.home.textslideview.R; public class SlideView extends LinearLayout {  private static final String TAG = SlideView.class.getSimpleName();  private Context mContext; private Scroller mScroller; private OnSlideListener mOnSlideListener;  private int mHolderWidth = 80;  private int mLastX = 0; private int mLastY = 0; private static final int TAN = 2;  private LayoutInflater inflater;  public interface OnSlideListener { public static final int SLIDE_STATUS_OFF = 0; public static final int SLIDE_STATUS_START_SCROLL = 1; public static final int SLIDE_STATUS_ON = 2;  /** * @param view *   current SlideView * @param status *   SLIDE_STATUS_ON or SLIDE_STATUS_OFF */ public void onSlide(View view, int status); }  public SlideView(Context context) { super(context); initView(); }  public SlideView(Context context, AttributeSet attrs) { super(context, attrs); initView(); }  private void initView() { mContext = getContext(); if (inflater == null) { inflater = LayoutInflater.from(mContext); } mScroller = new Scroller(mContext);  setOrientation(LinearLayout.HORIZONTAL); View.inflate(mContext, R.layout.slide_view_merge, this); mHolderWidth = Math.round(TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources()  .getDisplayMetrics())); }  public void setOnSlideListener(OnSlideListener onSlideListener) { mOnSlideListener = onSlideListener; }  public void shrink() { if (getScrollX() != 0) { this.smoothScrollTo(0, 0); } }  public void onRequireTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); int scrollX = getScrollX(); Log.d(TAG, "x=" + x + " y=" + y);  switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { if (!mScroller.isFinished()) { mScroller.abortAnimation(); } if (mOnSlideListener != null) { mOnSlideListener.onSlide(this,  OnSlideListener.SLIDE_STATUS_START_SCROLL); } break; } case MotionEvent.ACTION_MOVE: { int deltaX = x - mLastX; int deltaY = y - mLastY; if (Math.abs(deltaX) < Math.abs(deltaY) * TAN) { break; }  int newScrollX = scrollX - deltaX; if (deltaX != 0) { if (newScrollX < 0) {  newScrollX = 0; } else if (newScrollX > mHolderWidth) {  newScrollX = mHolderWidth; } this.scrollTo(newScrollX, 0); } break; } case MotionEvent.ACTION_UP: { int newScrollX = 0; if (scrollX - mHolderWidth * 0.75 > 0) { newScrollX = mHolderWidth; } this.smoothScrollTo(newScrollX, 0); if (mOnSlideListener != null) { mOnSlideListener.onSlide(this,  newScrollX == 0 ? OnSlideListener.SLIDE_STATUS_OFF  : OnSlideListener.SLIDE_STATUS_ON); } break; } default: break; }  mLastX = x; mLastY = y; }  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(); } } }

main.xml:

<?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" >   <com.home.testslideview.SlideListView  android:id="@+id/main_lv"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:cacheColorHint="#00000000"  android:fadingEdge="none"  android:listSelector="#00000000"  android:scrollbars="none" /> </LinearLayout>

slide_view_merge.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" android:orientation="horizontal" >  <LinearLayout  android:id="@+id/slideview_layout_content"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:layout_gravity="center_vertical"  android:gravity="center_vertical"  android:orientation="horizontal" >    <TextView    android:id="@+id/slideview_tv_content"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:text="內容部分"/>  </LinearLayout>  <LinearLayout  android:id="@+id/view_layout_del"  android:layout_width="80dp"  android:layout_height="match_parent"  android:layout_gravity="center_vertical"  android:layout_toRightOf="@id/slideview_layout_content"  android:clickable="true"  android:gravity="center_vertical"  android:orientation="horizontal" >   <TextView   android:id="@+id/slideview_tv_del"   android:layout_width="80dp"   android:layout_height="match_parent"   android:layout_marginBottom="2dp"   android:gravity="center"   android:padding="15dp"   android:text="刪除"/>  </LinearLayout> </merge>

源碼下載:高仿微信左滑刪除效果

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频999| 久久久久久久久中文字幕| 日韩成人av网| 亚洲精品中文字幕av| 日韩高清电影免费观看完整版| 亚洲精品电影网| 久久色在线播放| 欧美做受高潮电影o| 国产精品jizz在线观看麻豆| 国产剧情日韩欧美| 中文字幕自拍vr一区二区三区| 久久久久久久久久久成人| 亚洲国产精品99| 91av免费观看91av精品在线| 欧美日本黄视频| 亚洲成人久久一区| 亚洲精品日韩丝袜精品| 91精品国产色综合| 97视频国产在线| 欧美视频在线观看免费| 久久久噜噜噜久久久| 国内免费久久久久久久久久久| 日韩电影在线观看永久视频免费网站| 亚洲一区美女视频在线观看免费| 7777精品视频| 在线亚洲男人天堂| 国产免费一区二区三区香蕉精| 91在线视频精品| 亚洲一区999| 亚洲老头老太hd| 欧美xxxx做受欧美| 日韩在线播放视频| 久久精品99无色码中文字幕| 最近2019中文字幕一页二页| 一区二区欧美在线| 久久久精品网站| 欧美激情亚洲自拍| 亚洲精品中文字幕av| 97人人爽人人喊人人模波多| 97在线视频国产| yellow中文字幕久久| 日韩美女主播视频| 成人h视频在线| 亚洲精品白浆高清久久久久久| 永久免费毛片在线播放不卡| 国模视频一区二区| 国产精品爱久久久久久久| 欧美中文字幕在线观看| 国产精品男女猛烈高潮激情| 亚洲人成网站色ww在线| 欧美黑人巨大xxx极品| 欧洲精品在线视频| 精品香蕉一区二区三区| 91精品视频在线看| 在线视频免费一区二区| 国产亚洲精品美女久久久| 91网在线免费观看| 青草热久免费精品视频| 在线电影中文日韩| 欧美性猛交xxxx富婆弯腰| 欧美一级淫片videoshd| 九九精品视频在线观看| 国产成人免费av电影| 国产精品高清在线观看| 欧美亚洲另类视频| 欧美精品videosex牲欧美| 成人黄色午夜影院| 国产一区二区三区毛片| 精品视频在线播放| 亚洲电影在线观看| 一区二区三欧美| 欧美黑人巨大xxx极品| 精品国产一区二区三区久久久狼| 日韩精品视频三区| 亚洲国产小视频在线观看| 亚洲欧美日韩一区二区在线| 成人做爽爽免费视频| 国产精品96久久久久久| 深夜福利91大全| 国产成人精品久久二区二区91| 欧美一级高清免费播放| 激情成人在线视频| 欧美另类在线观看| 97超级碰在线看视频免费在线看| 国产精品视频公开费视频| 欧美夫妻性视频| 国产亚洲精品久久久久久牛牛| 黑人巨大精品欧美一区二区免费| 色综合视频一区中文字幕| 92看片淫黄大片看国产片| 三级精品视频久久久久| 国产欧美精品在线播放| 欧美日本亚洲视频| yw.139尤物在线精品视频| 中文字幕亚洲一区| 亚洲精品午夜精品| 日韩在线视频导航| 国产精品99久久久久久久久久久久| 久久久欧美一区二区| 国产精品欧美亚洲777777| 97视频国产在线| 九九久久久久99精品| 欧美激情网友自拍| 中文字幕在线国产精品| 久久久久久免费精品| 亚洲免费一级电影| 国产区精品在线观看| 91精品视频网站| 亚洲成色www8888| 777国产偷窥盗摄精品视频| 91精品视频免费观看| 亚洲精品丝袜日韩| 97碰碰碰免费色视频| 色噜噜狠狠狠综合曰曰曰88av| 欧美日韩精品在线播放| 伊人久久久久久久久久久久久| 亚洲精品资源美女情侣酒店| 日韩欧美在线视频日韩欧美在线视频| 欧美一级电影免费在线观看| 九九久久综合网站| 欧美精品成人在线| 日韩av在线播放资源| 日本人成精品视频在线| 国外成人在线视频| 日本视频久久久| 日韩精品久久久久| 欧美日韩中文字幕| 久久综合九色九九| 欧美日韩国产色| 亚洲自拍欧美另类| 日韩在线观看免费| 欧美激情女人20p| 亚洲视频精品在线| 福利微拍一区二区| 日韩电影大全免费观看2023年上| 久久综合免费视频影院| 亚洲综合精品一区二区| 91高清免费在线观看| 亚洲国产女人aaa毛片在线| 国产精品视频在线观看| 国产在线日韩在线| 亚洲福利视频免费观看| 日韩性xxxx爱| 成人做爰www免费看视频网站| 亚洲黄色在线观看| 欧美精品第一页在线播放| 欧美精品中文字幕一区| 国产精品免费小视频| 亚洲香蕉av在线一区二区三区| 亚洲精品xxxx| 日韩欧美综合在线视频| 国产亚洲美女精品久久久| 少妇高潮久久77777| 亚洲欧美成人在线| 欧美国产日产韩国视频| 欧美成人激情在线| 亚洲性生活视频| 国产日韩欧美在线播放| 久久精品91久久香蕉加勒比| 欧美xxxx做受欧美| 自拍偷拍亚洲欧美| 91豆花精品一区| 亚洲free嫩bbb| 亚洲免费一级电影|