Android 使用NineOldAndroids实现仿微信listview左滑出现删除itembutton

这是一个使用NineOldAndroids实现仿微信listview左滑出现删除itembutton效果。使用的是Jake Wharton的动画开源库NineOldAndroids。在API3.0(Honeycomb),
SDK新增了一个android.animation包,里面的类是实现动画效果相关的类,通过Honeycomb API,能够实现非常复杂的动画效果,但是如果开发者想在3.0以下使用这一套API, 则需要使用开源框架Nine Old Androids,在这个库中会根据我们运行的机器判断其SDK版本,如果是API3.0以上则使用Android自带的动画类,否则就使用Nine Old Androids库中,这是一个兼容库。而在这里实现的是使用NineOldAndroids这个库,实现这种效果。这个库的下载地址:点击下载

本文项目源码地址:点击下载

下面来看看部分代码是怎样实现的。

一、先看最终的效果图

二、使用这个listview的适配器RecentAdapter

package com.listview.adapter;

import java.util.LinkedList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.main.entity.RecentItem;
import com.main.listviewsideslip.R;
import com.view.listview.SwipeListView;

public class RecentAdapter extends BaseAdapter {
	private LayoutInflater mInflater;
	private LinkedList<RecentItem> mData;
	private SwipeListView mListView;
	private Context mContext;

	public RecentAdapter(Context context, LinkedList<RecentItem> data,
			SwipeListView listview) {
		mContext = context;
		this.mInflater = LayoutInflater.from(mContext);
		mData = data;
		this.mListView = listview;
	}

	public void remove(int position) {
		if (position < mData.size()) {
			mData.remove(position);
			notifyDataSetChanged();
		}
	}

	public void remove(RecentItem item) {
		if (mData.contains(item)) {
			mData.remove(item);
			notifyDataSetChanged();
		}
	}

	public void addFirst(RecentItem item) {
		if (mData.contains(item)) {
			mData.remove(item);
		}
		mData.addFirst(item);
		notifyDataSetChanged();
	}

	@Override
	public int getCount() {
		return mData.size();
	}

	@Override
	public Object getItem(int position) {
		return mData.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		final RecentItem item = mData.get(position);
		ViewHolder vHolder = null;
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.recent_listview_item, null);
			vHolder = new ViewHolder();
			vHolder.nameTV = (TextView) convertView.findViewById(R.id.recent_list_item_name);
			vHolder.numTV = (TextView) convertView.findViewById(R.id.unreadmsg);
			vHolder.headIV = (ImageView) convertView.findViewById(R.id.icon);
			vHolder.deleteBtn = (Button) convertView.findViewById(R.id.recent_del_btn);

			convertView.setTag(vHolder);
		}else {
			vHolder  = (ViewHolder) convertView.getTag();
		}

		vHolder.nameTV.setText(item.getName());
		vHolder.headIV.setImageResource(item.getHeadImg());

		int num = item.getNewNum();
		if (num > 0) {
			vHolder.numTV.setVisibility(View.VISIBLE);
			vHolder.numTV.setText(num + "");
		} else {
			vHolder.numTV.setVisibility(View.GONE);
		}

		vHolder.deleteBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				mData.remove(position);
				notifyDataSetChanged();
				if (mListView != null)
					mListView.closeOpenedItems();
			}
		});
		return convertView;
	}

	class ViewHolder{
		public TextView nameTV;
		public TextView numTV;
		public ImageView headIV;
		public Button deleteBtn;
	}
}

三、使用这个适配器的一些接口BaseSwipeListViewListener

package com.view.listview;

public abstract class BaseSwipeListViewListener implements SwipeListViewListener {
    @Override
    public void onOpened(int position, boolean toRight) {
    }

    @Override
    public void onClosed(int position, boolean fromRight) {
    }

    @Override
    public void onListChanged() {
    }

    @Override
    public void onMove(int position, float x) {
    }

    @Override
    public void onStartOpen(int position, int action, boolean right) {
    }

    @Override
    public void onStartClose(int position, boolean right) {
    }

    @Override
    public abstract void onClickFrontView(int position);

    @Override
    public abstract void onClickBackView(int position);

    @Override
    public abstract void onDismiss(int[] reverseSortedPositions);

    @Override
    public int onChangeSwipeMode(int position) {
        return SwipeListView.SWIPE_MODE_DEFAULT;
    }
}

四、怎么调用上面的接口以及适配器,返回的接口。以及数据源的添加。看以下MainActivity

package com.main.listviewsideslip;

import java.util.Collections;
import java.util.LinkedList;
import com.listview.adapter.RecentAdapter;
import com.main.entity.RecentItem;
import com.view.listview.BaseSwipeListViewListener;
import com.view.listview.SwipeListView;
import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {

	private RecentAdapter mAdapter;
	private LinkedList<RecentItem> mRecentDatas;
	private SwipeListView mRecentListView;
	private TextView mEmpty;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initView(savedInstanceState);
	}

	private void initView(Bundle savedInstanceState) {
		mRecentListView = (SwipeListView) findViewById(R.id.recent_listview);
		mRecentDatas = getRecentList();
		mAdapter = new RecentAdapter(this, mRecentDatas, mRecentListView);
		mRecentListView.setAdapter(mAdapter);

		mEmpty = (TextView) findViewById(R.id.empty);
		mRecentListView.setEmptyView(mEmpty);
		mRecentListView
				.setSwipeListViewListener(new BaseSwipeListViewListener() {

					@Override
					public void onClickFrontView(int position) {

					}

					@Override
					public void onClickBackView(int position) {
						mRecentListView.closeOpenedItems();// 关闭打开的项
					}

					@Override
					public void onDismiss(int[] reverseSortedPositions) {
						for (int position : reverseSortedPositions) {
							mAdapter.remove(position);
						}

					}
				});

	}

	//数据源
	public LinkedList<RecentItem> getRecentList() {
		LinkedList<RecentItem> list = new LinkedList<RecentItem>();
		nameArray = getResources().getStringArray(R.array.jazzy_effects_ch);
		for (int i = 0; i < 20; i++) {

			int icon = heads[i];
			String name = nameArray[i];
			int num = numArray[i];
			RecentItem item = new RecentItem(name, icon, num);
			list.add(item);
		}
		Collections.sort(list);// 降序
		return list;
	}

	public static  int[] heads = { R.drawable.h0, R.drawable.h1,
		R.drawable.h2, R.drawable.h3, R.drawable.h4, R.drawable.h5,
		R.drawable.h6, R.drawable.h7, R.drawable.h8, R.drawable.h9,
		R.drawable.h10, R.drawable.h11, R.drawable.h12, R.drawable.h13,
		R.drawable.h14, R.drawable.h15, R.drawable.h16, R.drawable.h17,
		R.drawable.h18, R.drawable.h19, R.drawable.h20, R.drawable.h21};

	public static  int[] numArray = { 21,67,65,8,54,67,23,78,98,54,67,23,67,423,23,67,90,12,34,56,978};

	public static String[] nameArray = new String[21];

}

其他动画效果怎么弄出来的代码就不贴,包括怎样进行手势的控制。有兴趣下载本文的项目认真查看。xml文件也不贴出来。全部贴有点多。这里只说怎么使用这个库,相关的适配器,接口。实现的效果在本文的最上面。虽然在上面的注释写得很少。我相信使用继承BaseAdapter较多开发者,都能看清楚这个流程。如果新手看不懂,怎样使用这个开源库,请在下面留言。我会耐心解答。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-05 11:12:09

Android 使用NineOldAndroids实现仿微信listview左滑出现删除itembutton的相关文章

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

在实际项目中删除列表中的某一项是非常常见的功能,传统的做法可以使用长按监听器等,而现在流行的做法是左滑弹出删除按钮,微信,QQ等都是这么做的,下面做一个示例,代码如下: 主页面MainActivity:代码比较简单常规 package com.home.testslideview; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; im

Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果, 之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变 成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就

Android 自定义View,仿微信视频播放按钮

闲着,尝试实现了新版微信视频播放按钮,使用的是自定义View,先来个简单的效果图...真的很简单哈. 由于暂时用不到,加上时间原因,加上实在是没意思,加上……,本控件就没有实现自定义属性,有兴趣的朋友可以自己去添加一下,方法都给你们准备好了.- = 其实这个控件主要步骤 1.画外环的圆 2.画进度的圆或者画三角形播放按钮 其余剩下的都是围绕以上两步准备或者收尾的. 接下来贴主要我们的自定义控件代码,注释很全,我就不过多解释了,请各位看官自己分析,有疑问可以在评论区一起讨论. package co

ListView左滑删除&amp;代理模式

要实现类似QQ的ListView左滑删除其实可以给ListView中每个条目外面添加一个可以处理左滑事件的View即可.该控件需要重写onInterceptTouchEvent方法和onTouchEvent方法,具体处理过程参考 安卓事件分发机制,确定由自定义控件处理触摸事件后需要调用requestDisallowInterceptTouchEvent来防止ListView响应事件. 下面介绍如何通过代理来实现. public class SlideListView extends ListVi

本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877)Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就知道

Android开发技巧——定制仿微信图片裁剪控件

拍照--裁剪,或者是选择图片--裁剪,是我们设置头像或上传图片时经常需要的一组操作.上篇讲了Camera的使用,这篇讲一下我对图片裁剪的实现. 背景 下面的需求都来自产品. 裁剪图片要像微信那样,拖动和放大的是图片,裁剪框不动. 裁剪框外的内容要有半透明黑色遮罩. 裁剪框下面要显示一行提示文字(这点我至今还是持保留意见的). 在Android中,裁剪图片的控件库还是挺多的,特别是github上比较流行的几个,都已经进化到比较稳定的阶段,但比较遗憾的是它们的裁剪过程是拖动或缩放裁剪框,于是只好自己

android之使用GridView+仿微信图片上传功能(附源代码)

由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传.拍照.本地选择.相片裁剪等功能,如果有需要的朋友可以看一下,希望我的实际经验能对您有所帮助. 直接上图,下面的图片就是点击"加号"后弹出的对话框,通过对话框可以根据自己需求进行相片选择. 项目结构: 下面直接上代码. 整体的布局文件activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.co

Android -- 真正的 高仿微信 打开网页的进度条效果

(本博客为原创,http://home.cnblogs.com/u/linguanh/) 目录: 一,为什么说是真正的高仿? 二,为什么要搞缓慢效果? 三,我的实现思路 四,代码,内含注释 五,使用方法与截图 六,完整项目 一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是实现方法都是一样的,而且,都忽略了微信加载网页时,进度条的缓慢动画效果,它不是生硬地一

android 左滑删除控件,仿ios的左滑

GitHub地址:https://github.com/weileng11/SwipeRecyclerView-master 自定义的思路: 可以使用 HorizontalScrollView 控件,但是需要判断滑动距离,点击取消左滑的控件. 原文地址:https://www.cnblogs.com/IT-lss/p/10731757.html