最近项目在做IM即时通讯开发,在删除聊天列表的时候跟删除聊天详细信息的时候,产品经理想要跟ios一样,在当前选中行上方弹出一个删除窗口.于是先从网上找demo,找了一个发现是Dialog做的,我感觉没有必要这么麻烦,于是我用Popupwindow实现了一个,有需要的朋友可以参考一下。

1.效果图如下(长按列表弹窗,消息详细信息长按弹窗)

2.对源码进行说明。

一条消息实体类,有消息内容跟是否发送这两个属性。

public class Message {private String content;// 消息内容private boolean sended;// 是否发送public Message(){}public Message(String content,boolean sended){this.content=content;this.sended=sended;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public boolean isSended() {return sended;}public void setSended(boolean sended) {this.sended = sended;}
}

消息详细信息的Activity

1).给每条消息设置长按事件,把点击的下标用tag传进去

2).用popupwindow展示,显示在当前点击的View下方,然后设置xy的偏移度

 * 消息详细界面* @author ansen* @create time 2015-08-04*/
public class MessageDetailActivity extends Activity{private List<Message> messages=new ArrayList<Message>();private ListView listView;private MyAdapter mAdapter;private PopupWindow popupWindow;private TextView tvDelete;private EditText etInput;private int longClickPosition;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_private_message_detail_list);initData();listView=(ListView) findViewById(R.id.list_private_message);listView.setAdapter(mAdapter=new MyAdapter());TextView sendMessage=(TextView) findViewById(R.id.tv_send_message);sendMessage.setOnClickListener(clickListener);etInput=(EditText) findViewById(R.id.et_input);}private class MyAdapter extends BaseAdapter{private LayoutInflater inflater;public MyAdapter(){inflater=LayoutInflater.from(MessageDetailActivity.this);}@Overridepublic int getCount() {return messages.size();}@Overridepublic Object getItem(int position) {return messages.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if(null==convertView){holder=new ViewHolder();convertView= inflater.inflate(R.layout.item_private_message_chat,parent,false);holder.tvMessageTo=(TextView) convertView.findViewById(R.id.tv_message_to);holder.ivMessageToHeadImage=(ImageView) convertView.findViewById(R.id.iv_message_to_head_image);holder.tvMessageFrom=(TextView) convertView.findViewById(R.id.tv_message_from);holder.ivMessageFromHeadImage=(ImageView) convertView.findViewById(R.id.iv_message_from_head_image);convertView.setTag(holder);}else{holder=(ViewHolder) convertView.getTag();}Message message=messages.get(position);if(message.isSended()){//发送消息holder.tvMessageTo.setVisibility(View.GONE);holder.ivMessageToHeadImage.setVisibility(View.GONE);holder.tvMessageFrom.setVisibility(View.VISIBLE);holder.tvMessageFrom.setText(message.getContent());holder.tvMessageFrom.setOnLongClickListener(longClickListener);holder.tvMessageFrom.setTag(position);holder.ivMessageFromHeadImage.setVisibility(View.VISIBLE);}else{//接收消息holder.tvMessageFrom.setVisibility(View.GONE);holder.ivMessageFromHeadImage.setVisibility(View.GONE);holder.tvMessageTo.setVisibility(View.VISIBLE);holder.tvMessageTo.setText(message.getContent());holder.tvMessageTo.setOnLongClickListener(longClickListener);holder.tvMessageTo.setTag(position);holder.ivMessageToHeadImage.setVisibility(View.VISIBLE);}return convertView;}private class ViewHolder{private ImageView ivMessageToHeadImage;//接收消息用户头像private TextView tvMessageTo;//接收消息内容private ImageView ivMessageFromHeadImage;//发送消息用户头像private TextView tvMessageFrom;//发送消息内容}}private OnLongClickListener longClickListener=new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {longClickPosition=(Integer) v.getTag();showDialog(v);return true;}};private void  showDialog(View view){if(null==popupWindow){View popView = LayoutInflater.from(this).inflate(R.layout.layout_long_click_dialog, null);tvDelete=(TextView) popView.findViewById(R.id.tv_delete);tvDelete.setOnClickListener(clickListener);popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);popupWindow.setAnimationStyle(R.style.PopAnimStyle);popupWindow.setOutsideTouchable(true);popupWindow.setBackgroundDrawable(new BitmapDrawable());}if (popupWindow.isShowing())popupWindow.dismiss();//第一次显示控件的时候宽高会为0 int deleteHeight=tvDelete.getHeight()==0?145:tvDelete.getHeight();int deleteWidth=tvDelete.getWidth()==0?212:tvDelete.getWidth();popupWindow.showAsDropDown(view,(view.getWidth()-deleteWidth)/2,-view.getHeight()-deleteHeight);}private OnClickListener clickListener=new OnClickListener() {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv_delete:messages.remove(longClickPosition);mAdapter.notifyDataSetChanged();popupWindow.dismiss();break;case R.id.tv_send_message:String content=etInput.getText().toString().trim();if(!TextUtils.isEmpty(content)){Message message=new Message(content, true);messages.add(message);mAdapter.notifyDataSetChanged();listView.setSelection(mAdapter.getCount()-1);}break;}}};private void initData(){Message message=new Message("范德萨范德", true);Message message7=new Message("范德萨范德fds", true);Message message1=new Message("个人提个人鬼地", false);Message message4=new Message("接收消息", false);Message message2=new Message("吃饭了嘛。。。。吃过了没有啊。。。。。还没有吃啊 范德萨范德萨发水电费的说法都是", true);Message message3=new Message("吃饭了嘛。。。。吃过了没有啊。。。。。还没有吃啊 范德萨范德萨发水电费的说法都是", false);messages.add(message);messages.add(message1);messages.add(message2);messages.add(message3);messages.add(message4);messages.add(message7);}
}

消息详细列表布局文件 activity_private_message_detail_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><ListViewandroid:id="@+id/list_private_message"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@+id/ll_bottom"android:divider="@null" ></ListView><includeandroid:id="@+id/ll_bottom"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"layout="@layout/layout_input_comment" /></RelativeLayout>

底部输入框布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingBottom="7dip"android:paddingTop="7dip"><ImageViewandroid:id="@+id/iv_message_to_head_image"android:layout_alignParentLeft="true"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/slide_left_avatar_default"/><TextViewandroid:id="@+id/tv_message_to"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/icon_message_to"android:gravity="center"android:paddingLeft="20dip"android:textColor="@color/register_text_color"android:layout_toRightOf="@+id/iv_message_to_head_image"android:layout_marginRight="55dp"android:textSize="16dip"/><TextViewandroid:id="@+id/tv_message_from"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toLeftOf="@+id/iv_message_from_head_image"android:background="@drawable/icon_message_from"android:gravity="center"android:paddingRight="20dip"android:textColor="@color/white_normal"android:layout_marginLeft="55dp"android:text="我已经吃过了"android:textSize="16dip"/><!--          --><ImageViewandroid:id="@+id/iv_message_from_head_image"android:layout_alignParentRight="true"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/slide_left_avatar_default"/></RelativeLayout></LinearLayout>

每一条消息的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingBottom="7dip"android:paddingTop="7dip"><ImageViewandroid:id="@+id/iv_message_to_head_image"android:layout_alignParentLeft="true"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/slide_left_avatar_default"/><TextViewandroid:id="@+id/tv_message_to"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/icon_message_to"android:gravity="center"android:paddingLeft="20dip"android:textColor="@color/register_text_color"android:layout_toRightOf="@+id/iv_message_to_head_image"android:layout_marginRight="55dp"android:textSize="16dip"/><TextViewandroid:id="@+id/tv_message_from"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toLeftOf="@+id/iv_message_from_head_image"android:background="@drawable/icon_message_from"android:gravity="center"android:paddingRight="20dip"android:textColor="@color/white_normal"android:layout_marginLeft="55dp"android:text="我已经吃过了"android:textSize="16dip"/><!--          --><ImageViewandroid:id="@+id/iv_message_from_head_image"android:layout_alignParentRight="true"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/slide_left_avatar_default"/></RelativeLayout></LinearLayout>

弹出删除按钮的布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:id="@+id/tv_delete"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/icon_private_message_delete"android:gravity="center_horizontal"android:padding="5dp"android:text="删除"android:textColor="#ffffffff" /></FrameLayout>

点击链接下载源码

Android仿qq聊天记录长按删除功能效果相关推荐

  1. 自定义 View(一)仿 QQ 列表 Item 侧拉删除功能

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  2. Android仿QQ消息拖拽黏连消失效果,气泡爆炸效果

    公司需要这个效果,看了很多博客,根据自己项目的需要写出来的一个完整的过程. 拖拽控件代码 根据手势拖动的位置利用贝塞尔曲线算法画出控件 package cn.stike.bubble.stickbub ...

  3. android 自定义园动画,Android 自定View实现仿QQ运动步数圆弧及动画效果

    在之前的Android超精准计步器开发-Dylan计步中的首页用到了一个自定义控件,和QQ运动的界面有点类似,还有动画效果,下面就来讲一下这个View是如何绘制的. 1.先看效果图 2.效果图分析 功 ...

  4. android气泡聊天消息背景,Android使用贝塞尔曲线仿QQ聊天消息气泡拖拽效果

    本文实例为大家分享了Android仿QQ聊天消息气泡拖拽效果展示的具体代码,供大家参考,具体内容如下 先画圆,都会吧.代码如下: public class Bezier extends View { ...

  5. 仿QQ异地登录强制下线功能的实现

    一,仿QQ异地登录强制下线功能 效果:同一个账号,最后一个登录的用户会把前一个登录后的用户顶掉,被迫下线! 1,剖析登录原理 登录的后台逻辑 准备一张账户信息表(账号,密码,是否禁用等字段) 查询账号 ...

  6. android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id(修改版)

    首先注明该文章是借签别人的博客,原文博文地址点击打开链接 android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id 这个需求来源:本人做集成环信聊天时,项目需要@功能 ...

  7. android人脸识显示头像自定义,Android 仿QQ头像自定义截取功能

    看了Android版QQ的自定义头像功能,决定自己实现,随便熟悉下android绘制和图片处理这一块的知识. 先看看效果: 思路分析: 这个效果可以用两个View来完成,上层View是一个遮盖物,绘制 ...

  8. Android仿QQ实现聊天功能

    前段时间下载了Android仿QQ界面和聊天的Demo,发现很有意思,于是研究了一下并自己在此基础上集成环信实现了在线聊天功能,可以实现注册.加人.审核通知.推送.创建群组.群组聊天,并加入了炫酷的背 ...

  9. android动画送礼物,Android仿直播类app赠送礼物功能

    直播界面 实现的是播放本地的视频文件: /** * 直播界面,用于对接直播功能 */ public class LiveFrag extends Fragment { private ImageVie ...

最新文章

  1. 怎样使用Mendeley高效地管理中文文献
  2. JavaScript学习(十)
  3. should,would,could,must,might,may,can有什么区别
  4. 用html5播放两个视频,HTML5视频 - 如何进行无缝播放和/或几个视频循环?
  5. 安装openJDK 8
  6. BZOJ2612 : [Poi2003]Sums
  7. Web Service 移除 xmlns
  8. svn update中文报错_svn不能更新也不能提交!为什么?
  9. html优化的基本网页布局,网站页面标题的SEO优化及布局要点
  10. 【洛谷P1972】HH的项链(求区间内有多少个不同的数---树状数组)
  11. python有哪几种数据结构_Python最常用的数据结构6种
  12. C语言绘画示例-进度条
  13. CPU 手机CPU 显示 天梯图
  14. html5 ie7兼容性问题,解决浏览器IE6,IE7兼容性的总结
  15. HDU - 6344 2018百度之星资格赛 1001调查问卷(状压dp)
  16. 【PTA】谷歌的招聘(C语言)
  17. 0x00007FFA837F2487 (ucrtbased.dll)处(位于 指针.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000068 时发生访问冲突
  18. 哪些大学有电子与计算机工程专业,校友会2017中国大学电子与计算机工程专业排行榜...
  19. ping pong buffer
  20. thinkphp多用户在线客服系统源码-thinkPHP内核 附使用教程

热门文章

  1. 制作字母开头的流水条形码
  2. web前端学习(四)JavaScript学习笔记部分(7)-- JavaScript DOM对象控制HTML元素详解...
  3. 如何完成微信小程序毕业设计的写作流程及答辩过程
  4. 联想ThinkServer RD640 服务器做RAID 5
  5. python|教你一行代码用Ta的名字比心
  6. 那些思念_元曦血狼_新浪博客
  7. 北京大地空间测试软件学校,测量与空间信息实验室
  8. 集成学习(三):adaboost算法推导
  9. 3D虚拟化技术透析及竞争分析
  10. windows 程序异常崩溃等错误定位