Android仿微信实现左滑显示删除按钮功能

在实际项目中删除列表中的某一项是非常常见的功能,传统的做法可以使用长按监听器等,而现在流行的做法是左滑弹出删除按钮,微信,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>

源码下载:高仿微信左滑删除效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 实现左滑出现删除选项

    滑动删除的部分主要包含两个部分, 一个是内容区域(用于放置正常显示的view),另一个是操作区域(用于放置删除按钮).默认情况下,操作区域是不显示的,内容区域的大小是填充整个容 器,操作区域始终位于内容区域的右面.当开始滑动的时候,整个容器中的所有子view都像左滑动,如果操作区域此时是不可见的,设置为可见. 实现思路就是自定义一个layout SwipeLayout继承自FrameLayout.SwipeLayout包含两个子view,第一个子view是内容区域,第二个子view是操作 区域.

  • Android下拉刷新上拉加载更多左滑动删除

    一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相! 现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue;

  • Android仿QQ列表左滑删除操作

    最近学习了如何做一个像QQ的左滑RecyclerView的item显示选项的,主要是用到Scroller 我们首先新建一个自己的RecyclerView 定义好一些要用的的变量 重写构造方法,把前两个构造方法改为如下,使无论如何构造都要执行第三个构造方法 在第三个构造方法里初始化Scroller public class LeftSwipeMenuRecyclerView extends RecyclerView { //置顶按钮 private TextView tvTop; //删除按钮 p

  • Android仿QQ左滑删除置顶ListView操作

    最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图: 大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码 import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.v

  • Android使用PullToRefresh完成ListView下拉刷新和左滑删除功能

    ListView下刷新刷功能相信从事Android开发的猿友们并不陌生,包括现在Google亲儿子SwipeRefreshLayout实现效果在一些APP上也能看见(不过个人不喜欢官方的刷新效果).本文就带领一些刚入门android的朋友或者一起爱分享的朋友来简单的实现ListView的下拉刷新和左滑删除效果. 一.本文主要内容: 使用PullToRefresh完成ListView下拉.上拉刷新: 扩展PullToRefresh完美的实现ListView左滑删除效果: 注意:本文中的PullTo

  • Android自定义组合控件之自定义下拉刷新和左滑删除实例代码

    绪论 最近项目里面用到了下拉刷新和左滑删除,网上找了找并没有可以用的,有比较好的左滑删除,但是并没有和下拉刷新上拉加载结合到一起,要不就是一些比较水的结合,并不能在项目里面使用,小编一着急自己组合了一个,做完了和QQ的对比了一下,并没有太大区别,今天分享给大家,其实并不难,但是不知道为什么网上没有比较好的Demo,当你的项目真的很急的时候,又没有比较好的Demo,那么"那条友谊的小船儿真是说翻就翻啊",好了,下面先来具体看一下实现后的效果吧: 代码已经上传到Github上了,小伙伴们记

  • Android ListView实现仿iPhone实现左滑删除按钮的简单实例

    需要自定义ListView.这里就交FloatDelListView吧. 复写onTouchEvent方法.如下: @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN:<BR> // 获取按下的条目视图(child view) int childCount = getChildCount(); int[] listViewCo

  • Android使用CardView作为RecyclerView的Item并实现拖拽和左滑删除

    引言 CardView是Android 5.0系统之后引入的众多控件之一,实现之后的效果也是比较酷的,它经常被用在RecyclerView和ListView中的Item中.今天我们就来了解一下CardView的属性,然后使用CardView和RecyclerView结合实现一个可以拖拽Item的布局. CardView的属性 CardView继承自FrameLayout,所以子控件的布局规则和FrameLayout的一样,是按照层次堆叠的 下面是CardView的一些常用属性: CardView

  • Android仿QQ首页ListView左滑置顶、删除功能

    Android 仿QQ首页ListView左滑置顶.删除等实现源码,具体内容如下 效果图 实现源码:package com.duguang.baseanimation.ui.listivew.deletelistview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.

  • Android实现左滑删除列表功能

    本文实例为大家分享了Android自定义左滑删除列表的具体代码,供大家参考,具体内容如下 1.布局文件view_left_slide_remove.xml 包含一个RelativeLayout和TextView,RelativeLayout是实际界面,TextView是删除按钮. <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://sch

随机推荐