<span style="font-size:24px;"><span style="white-space:pre">   </span>最近公司在做 一个飞信的一个功能!消息列表和QQ 的类似。</span>

图:

其是很简单,之前在github 搜索的 sliderList, sliderLayout.我都用不了。因为代码导入到 Eclispe 中无法使用。 这是网址: http://blog.csdn.net/phj_981805903/article/details/21394241

最后一位大神分享的代码:他的思路很简单,就是隐藏一个 删除的tab. 在出发时间的时候 显示 删除!

代码:

主要就是

sliderView 自定义的View 实现滑动的效果

ListViewCompat 自定义的listView   调用sliderVIew 的滑动!

mainActivity

<span style="font-size:18px;">package com.example.androidmenutoabhost;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Scroller;
import android.widget.TextView;import com.example.slidingview.R;public class SlideView extends LinearLayout {private static final String TAG = "SlideView";private Context mContext;private LinearLayout mViewContent;private RelativeLayout mHolder;private Scroller mScroller;private OnSlideListener mOnSlideListener;private int mHolderWidth = 120;private int mLastX = 0;private int mLastY = 0;private static final int TAN = 2;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();mScroller = new Scroller(mContext);setOrientation(LinearLayout.HORIZONTAL);View.inflate(mContext, R.layout.slide_view_merge, this);mViewContent = (LinearLayout) findViewById(R.id.view_content);mHolderWidth = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources().getDisplayMetrics()));}public void setButtonText(CharSequence text) {((TextView)findViewById(R.id.delete)).setText(text);}public void setContentView(View view) {mViewContent.addView(view);}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();}@Overridepublic void computeScroll() {if (mScroller.computeScrollOffset()) {scrollTo(mScroller.getCurrX(), mScroller.getCurrY());postInvalidate();}}}</span>
<span style="font-size:18px;">package com.example.androidmenutoabhost;import com.example.androidmenutoabhost.ActivityListDelte.MessageItem;import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ListView;public class ListViewCompat extends ListView {private static final String TAG = "ListViewCompat";private SlideView mFocusedItemView;public ListViewCompat(Context context) {super(context);}public ListViewCompat(Context context, AttributeSet attrs) {super(context, attrs);}public ListViewCompat(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}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);Log.e(TAG, "postion=" + position);if (position != INVALID_POSITION) {MessageItem data = (MessageItem) getItemAtPosition(position);mFocusedItemView = data.slideView;Log.e(TAG, "FocusedItemView=" + mFocusedItemView);}}default:break;}if (mFocusedItemView != null) {mFocusedItemView.onRequireTouchEvent(event);}return super.onTouchEvent(event);}}
</span>
<span style="font-size:18px;">package com.example.androidmenutoabhost;import java.util.ArrayList;
import java.util.List;import com.example.androidmenutoabhost.SlideView.OnSlideListener;
import com.example.slidingview.R;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;public class ActivityListDelte extends Activity implements OnClickListener,OnItemClickListener{private static final String TAG = "MainActivity";private ListViewCompat mListView;private List<MessageItem> mMessageItems = new ArrayList<ActivityListDelte.MessageItem>();private SlideView mLastSlideViewWithStatusOn;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_list_delete);initView();}private void initView() {mListView = (ListViewCompat) findViewById(R.id.list);for (int i = 0; i < 20; i++) {MessageItem item = new MessageItem();if (i % 20 == 0) {item.iconRes = R.drawable.wechat_icon;item.title = "腾讯新闻";item.msg = "青岛爆炸满月:大量鱼虾死亡";item.time = "晚上18:18";} else {item.iconRes = R.drawable.wechat_icon;item.title = "微信团队";item.msg = "欢迎你使用微信";item.time = "12月18日";}mMessageItems.add(item);}mListView.setAdapter(new SlideAdapter());mListView.setOnItemClickListener(this);}private class SlideAdapter extends BaseAdapter implements OnSlideListener{private LayoutInflater mInflater;SlideAdapter() {super();mInflater = getLayoutInflater();}@Overridepublic int getCount() {return mMessageItems.size();}@Overridepublic Object getItem(int position) {return mMessageItems.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;SlideView slideView = (SlideView) convertView;if (slideView == null) {View itemView = mInflater.inflate(R.layout.list_item, null);slideView = new SlideView(ActivityListDelte.this);slideView.setContentView(itemView);holder = new ViewHolder(slideView);slideView.setOnSlideListener(this);slideView.setTag(holder);} else {holder = (ViewHolder) slideView.getTag();}//回退的效果MessageItem item = mMessageItems.get(position);item.slideView = slideView;item.slideView.shrink();holder.icon.setImageResource(item.iconRes);holder.title.setText(item.title);holder.msg.setText(item.msg);holder.time.setText(item.time);holder.deleteHolder.setOnClickListener(ActivityListDelte.this);return slideView;}@Overridepublic void onSlide(View view, int status) {if (mLastSlideViewWithStatusOn != null && mLastSlideViewWithStatusOn != view) {mLastSlideViewWithStatusOn.shrink();}if (status == SLIDE_STATUS_ON) {mLastSlideViewWithStatusOn = (SlideView) view;}}}public class MessageItem {public int iconRes;public String title;public String msg;public String time;public SlideView slideView;}private static class ViewHolder {public ImageView icon;public TextView title;public TextView msg;public TextView time;public ViewGroup deleteHolder;ViewHolder(View view) {icon = (ImageView) view.findViewById(R.id.icon);title = (TextView) view.findViewById(R.id.title);msg = (TextView) view.findViewById(R.id.msg);time = (TextView) view.findViewById(R.id.time);deleteHolder = (ViewGroup)view.findViewById(R.id.holder);}}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {Log.e(TAG, "onItemClick position=" + position);}@Overridepublic void onClick(View v) {if (v.getId() == R.id.holder) {Log.e(TAG, "onClick v=" + v);Toast.makeText(this, "delete", Toast.LENGTH_SHORT).show();}}}
</span>
<span style="font-size:18px;">
</span>

项目下载的网址:

http://download.csdn.net/detail/love_javc_you/8533495

高仿 QQ 侧滑删除 Item 的效果相关推荐

  1. Android高仿QQ侧滑菜单

    文章目录 效果图 整体思路 实现过程 先分析SwipeMenuLayout 再分析下SwipeRecycleView 踩过的坑 后记 效果图 GIF图有点模糊,源码已上传Github:Android仿 ...

  2. 仿QQ侧滑删除ListView——2015第一博

    一直感觉QQ最近联系人那个侧滑删除功能挺高大上的,经过几经波折,终于在新的一年里实现了该功能.实现这个功能真是费了老劲了,好几次有了想法,兴奋的去写代码实现,结果让代码打了自己一个耳光,最终还是用ma ...

  3. 仿QQ侧滑删除,Listview上下滑动,Listview的iteam的点击事件等bug的解决

         网上ListView横向滑动删除Item这样的介绍也很多,但实用性不强,没有解决横向滑动和item的点击事件的冲突,废话少说,有图有真相,下面直接上代码 1:侧滑 2:侧滑的点击事件 3:i ...

  4. 高仿QQ空间发图片的效果

    项目需求只需要一张图片,需要其他的可以自己改改:代码地址在最下面 不好意思,在下午的测试中测到如果用户没有拍照,直接finish掉会空指针异常,现在已解决 @Overrideprotected voi ...

  5. Android高仿QQ消息列表、侧拉删除菜单按钮效果

    目    录(本篇字数:3000) 介绍 Item布局 自定义存放Item父容器 Bug分析 ·一.解决滑动冲突 二.解决Item点击事件的冲突 三.限制只能有一个menu被打开 博文续篇 ListV ...

  6. 【Android】史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/53157090 本文出 ...

  7. Android开发之高仿QQ消息侧拉删除

    Android开发之高仿QQ消息侧拉删除 QQ消息的侧滑删除效果之炫酷,想必大家都见过吧,本人作为一名安卓开发人员,遇到如此炫酷的效果,怎能不研究一番呢,现本人已实现其基本功能,现将代码贴出,望各位大 ...

  8. android+qq底部界面,Android 高仿QQ 界面滑动效果

    Android高仿QQ界面滑动效果 点击或者滑动切换画面,用ViewPager实现, 首先是布局文件: android:layout_width="match_parent" an ...

  9. Android仿QQ侧滑菜单

    先上效果图: GIF图有点模糊,源码已上传Github:Android仿QQ侧滑菜单 ####整体思路: 自定义ItemView的根布局(SwipeMenuLayout extends LinearL ...

最新文章

  1. 使用ajax追加样式没,ajax-动态添加内容后,jQuery Mobile不应用样式
  2. Sublime Text3 自定义快速生成代码
  3. 跨编译单元之初始化次序
  4. php复制mysql文件路径_与php 有关的问题 如何将上传的文件路径 保存到数据库中...
  5. Gartner:大数据和BI商业智能的差别和影响
  6. 启明云端分享| 2.4寸磁编码旋钮屏
  7. 【转载】12306铁道部订票网站性能分析
  8. oracle11g win10版本,win10系统安装的oracle11g和cloud6.2 创建数据中心报错
  9. 第一个JAVA实战项目!
  10. MongoDB数据同步工具之 MongoShake
  11. 用svn上的文件,覆盖本地文件
  12. 2012年10月第3周(10.15-10.21)
  13. Ubuntu个人笔记
  14. 【数据结构】- 教你一步完美应对面试官让你10分钟内实现带头双向循环链表(下)
  15. zool网关多个组件配置路由
  16. 一款国产的自动摘要在线工具-文皮皮
  17. laravel 简单聊聊singleton的实现过程
  18. linux getopt命令,Linux中getopt函数用法
  19. android之RecyclerView.Adapter介绍
  20. SPSS实现单样本K-S检验

热门文章

  1. ubuntu设置固定ip地址的方法
  2. 读李彦宏《硅谷商战》有感
  3. [转]尼采:快乐的知识(下)
  4. 俄语中的快乐怎么表达的呢
  5. 【永恒之塔私服今天开放了】
  6. 如何解决WebView打开网页不能自动播放声音的问题?
  7. xm command
  8. (第十八集)前端开发之js
  9. 来,让我康康!里面到底是什么样子的?Java内存模型
  10. Marble Map