在实际项目中删除列表中的某一项是很常见的功能。传统的做法能够使用长按监听器等,而如今流行的做法是左滑弹出删除button,微信,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;@Overrideprotected 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;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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());// 删除buttonTextView 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;}@Overridepublic void onSlide(View view, int status) {}@Overridepublic 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();}}}@Overridepublic 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.SlideListViewandroid: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" ><LinearLayoutandroid: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><LinearLayoutandroid: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" ><TextViewandroid: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>

源代码下载:http://download.csdn.net/detail/u010142437/8855289

转载于:https://www.cnblogs.com/gccbuaa/p/7209983.html

高仿微信实现左滑显示删除button功能相关推荐

  1. 微信小程序---左滑显示删除 movable-area

    movable-area 首先页面排版: <view class="act_box"><view class="product_item" w ...

  2. android通讯录项目_Flutter高仿微信项目开源-具即时通讯IM功能

    项目地址:https://github.com/fluttercandies/wechat_flutter wechat_flutter Flutter版本微信 效果图: 下载体验(Android): ...

  3. android高仿微信拍照、多选、预览、删除(去除相片)相冊功能

    先声明授人与鱼不如授人与渔,仅仅能提供一个思路,当然须要源代码的同学能够私下有偿问我要源代码:QQ:508181017 工作了将近三年时间了,一直没正儿八经的研究系统自带的相冊和拍照,这回来个高仿微信 ...

  4. android 自定义 滑动删除,Android_Android ListView实现仿iPhone实现左滑删除按钮的简单实例,需要自定义ListView。这里就交Fl - phpStudy...

    Android ListView实现仿iPhone实现左滑删除按钮的简单实例 需要自定义ListView.这里就交FloatDelListView吧. 复写onTouchEvent方法.如下: @Ov ...

  5. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...

    2019独角兽企业重金招聘Python工程师标准>>> iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实 ...

  6. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码

    iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实现与TableViewCell的常用样式介绍 实现阴影圆角并存,渐变色背景 ...

  7. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  8. android 微信高仿,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  9. Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)

    转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46453627 本文出自:[海龙的博客] 一.概述 在上一篇博文中,博文 ...

最新文章

  1. eclipse Debug中step into功能失灵的问题
  2. 7000 界面语言不升级_仅限今日!手把手教你C++图形界面开发|附完整代码,海量干货!...
  3. oracle 密码文件作用,测试 oracle 密码文件在何时起作用
  4. Linux下的I/O多路复用select,poll,epoll浅析
  5. Chrome下的语音控制框架MyVoix.js使用篇(二)
  6. 【经验】lingo / lindo报错:invalid syntax
  7. ICML(2020)对抗学习论文汇总
  8. 学海无涯!马士兵的Java教程
  9. 09 Python 利用爱心曲线函数打印自定义内容为爱心形状
  10. 读万卷书,行万里路。
  11. 设计模式——组合模式
  12. Excel中怎么添加批注
  13. Spring IOC/DI和AOP
  14. mui用ajax上拉加载更多,mui 中的一个上拉加载及下拉刷新的方法 ,但是我使用ajax拿不到url中的数据,是为什么?...
  15. PaddleHub一键视频动漫化
  16. 一些iOS实用Demo
  17. 内网渗透-window权限维持
  18. 计算机游戏32,腾讯宣布将32款游戏退市 2019中国十大科技成就公布
  19. Ternary weight networks 论文笔记
  20. 讯飞开发者大赛-环境空气质量评价挑战赛baseline

热门文章

  1. BUUCTF-WEB:[SUCTF 2019]EasySQL 1
  2. BUUCTF-Reverce:不一样的flag
  3. android Fragments详解
  4. OpenGL在frag着色器中模拟手电筒效果
  5. Spring Session 的两种刷新模式-RedisFlushMode
  6. FFmpeg再学习 -- 视音频基础知识
  7. PS菜鸟入门 -- 实战演示之磨皮
  8. replugin源码解析之replugin-plugin-gradle(插件的gradle插件)
  9. Keras TensorFlow教程:如何从零开发一个复杂深度学习模型
  10. Android 5.0及以上实现屏幕截图