Android仿qq聊天记录长按删除功能效果

简介:

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

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



2.对源码进行说明。

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

  1. public class Message {  
  2.     private String content;// 消息内容  
  3.     private boolean sended;// 是否发送  
  4.       
  5.     public Message(){  
  6.     }  
  7.       
  8.     public Message(String content,boolean sended){  
  9.         this.content=content;  
  10.         this.sended=sended;  
  11.     }  
  12.   
  13.     public String getContent() {  
  14.         return content;  
  15.     }  
  16.   
  17.     public void setContent(String content) {  
  18.         this.content = content;  
  19.     }  
  20.   
  21.     public boolean isSended() {  
  22.         return sended;  
  23.     }  
  24.   
  25.     public void setSended(boolean sended) {  
  26.         this.sended = sended;  
  27.     }  
  28. }  

消息详细信息的Activity

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

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

  1.  * 消息详细界面  
  2.  * @author ansen  
  3.  * @create time 2015-08-04  
  4.  */  
  5. public class MessageDetailActivity extends Activity{  
  6.     private List<Message> messages=new ArrayList<Message>();  
  7.     private ListView listView;  
  8.     private MyAdapter mAdapter;  
  9.       
  10.     private PopupWindow popupWindow;  
  11.     private TextView tvDelete;  
  12.     private EditText etInput;  
  13.     private int longClickPosition;  
  14.       
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_private_message_detail_list);  
  19.           
  20.         initData();  
  21.           
  22.         listView=(ListView) findViewById(R.id.list_private_message);  
  23.         listView.setAdapter(mAdapter=new MyAdapter());  
  24.           
  25.         TextView sendMessage=(TextView) findViewById(R.id.tv_send_message);  
  26.         sendMessage.setOnClickListener(clickListener);  
  27.           
  28.         etInput=(EditText) findViewById(R.id.et_input);  
  29.     }  
  30.       
  31.       
  32.     private class MyAdapter extends BaseAdapter{  
  33.         private LayoutInflater inflater;  
  34.         public MyAdapter(){  
  35.             inflater=LayoutInflater.from(MessageDetailActivity.this);  
  36.         }  
  37.   
  38.         @Override  
  39.         public int getCount() {  
  40.             return messages.size();  
  41.         }  
  42.   
  43.         @Override  
  44.         public Object getItem(int position) {  
  45.             return messages.get(position);  
  46.         }  
  47.   
  48.         @Override  
  49.         public long getItemId(int position) {  
  50.             return position;  
  51.         }  
  52.   
  53.         @Override  
  54.         public View getView(int position, View convertView, ViewGroup parent) {  
  55.             ViewHolder holder = null;  
  56.             if(null==convertView){  
  57.                 holder=new ViewHolder();  
  58.                 convertView= inflater.inflate(R.layout.item_private_message_chat,parent,false);  
  59.                 holder.tvMessageTo=(TextView) convertView.findViewById(R.id.tv_message_to);  
  60.                 holder.ivMessageToHeadImage=(ImageView) convertView.findViewById(R.id.iv_message_to_head_image);  
  61.                   
  62.                 holder.tvMessageFrom=(TextView) convertView.findViewById(R.id.tv_message_from);  
  63.                 holder.ivMessageFromHeadImage=(ImageView) convertView.findViewById(R.id.iv_message_from_head_image);  
  64.                 convertView.setTag(holder);  
  65.             }else{  
  66.                 holder=(ViewHolder) convertView.getTag();  
  67.             }  
  68.               
  69.             Message message=messages.get(position);  
  70.             if(message.isSended()){//发送消息  
  71.                 holder.tvMessageTo.setVisibility(View.GONE);  
  72.                 holder.ivMessageToHeadImage.setVisibility(View.GONE);  
  73.                   
  74.                 holder.tvMessageFrom.setVisibility(View.VISIBLE);  
  75.                 holder.tvMessageFrom.setText(message.getContent());  
  76.                 holder.tvMessageFrom.setOnLongClickListener(longClickListener);  
  77.                 holder.tvMessageFrom.setTag(position);  
  78.                   
  79.                 holder.ivMessageFromHeadImage.setVisibility(View.VISIBLE);  
  80.             }else{//接收消息  
  81.                 holder.tvMessageFrom.setVisibility(View.GONE);  
  82.                 holder.ivMessageFromHeadImage.setVisibility(View.GONE);  
  83.                   
  84.                 holder.tvMessageTo.setVisibility(View.VISIBLE);  
  85.                 holder.tvMessageTo.setText(message.getContent());  
  86.                 holder.tvMessageTo.setOnLongClickListener(longClickListener);  
  87.                 holder.tvMessageTo.setTag(position);  
  88.                   
  89.                 holder.ivMessageToHeadImage.setVisibility(View.VISIBLE);  
  90.             }  
  91.             return convertView;  
  92.         }  
  93.           
  94.         private class ViewHolder{  
  95.             private ImageView ivMessageToHeadImage;//接收消息用户头像  
  96.             private TextView tvMessageTo;//接收消息内容  
  97.               
  98.             private ImageView ivMessageFromHeadImage;//发送消息用户头像  
  99.             private TextView tvMessageFrom;//发送消息内容  
  100.         }  
  101.     }  
  102.       
  103.     private OnLongClickListener longClickListener=new OnLongClickListener() {  
  104.         @Override  
  105.         public boolean onLongClick(View v) {  
  106.             longClickPosition=(Integer) v.getTag();  
  107.             showDialog(v);  
  108.             return true;  
  109.         }  
  110.     };  
  111.       
  112.     private void  showDialog(View view){  
  113.         if(null==popupWindow){  
  114.             View popView = LayoutInflater.from(this).inflate(R.layout.layout_long_click_dialog, null);  
  115.             tvDelete=(TextView) popView.findViewById(R.id.tv_delete);  
  116.             tvDelete.setOnClickListener(clickListener);  
  117.             popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  118.             popupWindow.setAnimationStyle(R.style.PopAnimStyle);  
  119.             popupWindow.setOutsideTouchable(true);  
  120.             popupWindow.setBackgroundDrawable(new BitmapDrawable());  
  121.         }  
  122.         if (popupWindow.isShowing())  
  123.             popupWindow.dismiss();  
  124.           
  125.         //第一次显示控件的时候宽高会为0   
  126.         int deleteHeight=tvDelete.getHeight()==0?145:tvDelete.getHeight();  
  127.         int deleteWidth=tvDelete.getWidth()==0?212:tvDelete.getWidth();  
  128.           
  129.         popupWindow.showAsDropDown(view,(view.getWidth()-deleteWidth)/2,-view.getHeight()-deleteHeight);  
  130.     }  
  131.       
  132.     private OnClickListener clickListener=new OnClickListener() {  
  133.         @Override  
  134.         public void onClick(View v) {  
  135.             switch (v.getId()) {  
  136.             case R.id.tv_delete:  
  137.                 messages.remove(longClickPosition);  
  138.                 mAdapter.notifyDataSetChanged();  
  139.                   
  140.                 popupWindow.dismiss();  
  141.                 break;  
  142.             case R.id.tv_send_message:  
  143.                 String content=etInput.getText().toString().trim();  
  144.                 if(!TextUtils.isEmpty(content)){  
  145.                     Message message=new Message(content, true);  
  146.                     messages.add(message);  
  147.                     mAdapter.notifyDataSetChanged();  
  148.                     listView.setSelection(mAdapter.getCount()-1);  
  149.                 }  
  150.                 break;  
  151.             }  
  152.         }  
  153.     };  
  154.       
  155.     private void initData(){  
  156.         Message message=new Message("范德萨范德"true);  
  157.         Message message7=new Message("范德萨范德fds"true);  
  158.         Message message1=new Message("个人提个人鬼地"false);  
  159.         Message message4=new Message("接收消息"false);  
  160.         Message message2=new Message("吃饭了嘛。。。。吃过了没有啊。。。。。还没有吃啊 范德萨范德萨发水电费的说法都是"true);  
  161.         Message message3=new Message("吃饭了嘛。。。。吃过了没有啊。。。。。还没有吃啊 范德萨范德萨发水电费的说法都是"false);  
  162.         messages.add(message);  
  163.         messages.add(message1);  
  164.         messages.add(message2);  
  165.         messages.add(message3);  
  166.         messages.add(message4);  
  167.         messages.add(message7);  
  168.     }  
  169. }  

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

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/list_private_message"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         android:layout_above="@+id/ll_bottom"  
  11.         android:divider="@null" >  
  12.     </ListView>  
  13.   
  14.     <include  
  15.         android:id="@+id/ll_bottom"  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_alignParentBottom="true"  
  19.         layout="@layout/layout_input_comment" />  
  20.   
  21. </RelativeLayout>  


底部输入框布局

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation="vertical">  
  6.   
  7.     <RelativeLayout  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:paddingBottom="7dip"  
  11.         android:paddingTop="7dip">  
  12.           
  13.         <ImageView  
  14.             android:id="@+id/iv_message_to_head_image"  
  15.             android:layout_alignParentLeft="true"  
  16.             android:layout_marginLeft="5dp"  
  17.             android:layout_marginRight="5dp"  
  18.             android:layout_width="40dp"  
  19.             android:layout_height="40dp"  
  20.             android:src="@drawable/slide_left_avatar_default"/>  
  21.   
  22.         <TextView  
  23.             android:id="@+id/tv_message_to"  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content"  
  26.             android:background="@drawable/icon_message_to"  
  27.             android:gravity="center"  
  28.             android:paddingLeft="20dip"  
  29.             android:textColor="@color/register_text_color"  
  30.             android:layout_toRightOf="@+id/iv_message_to_head_image"  
  31.             android:layout_marginRight="55dp"  
  32.             android:textSize="16dip"/>  
  33.   
  34.         <TextView  
  35.             android:id="@+id/tv_message_from"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="wrap_content"  
  38.             android:layout_toLeftOf="@+id/iv_message_from_head_image"  
  39.             android:background="@drawable/icon_message_from"  
  40.             android:gravity="center"  
  41.             android:paddingRight="20dip"  
  42.             android:textColor="@color/white_normal"  
  43.             android:layout_marginLeft="55dp"  
  44.             android:text="我已经吃过了"  
  45.             android:textSize="16dip"/>  
  46.           
  47.         <!--          -->  
  48.         <ImageView  
  49.             android:id="@+id/iv_message_from_head_image"  
  50.             android:layout_alignParentRight="true"  
  51.             android:layout_marginLeft="5dp"  
  52.             android:layout_marginRight="5dp"  
  53.             android:layout_width="40dp"  
  54.             android:layout_height="40dp"  
  55.             android:src="@drawable/slide_left_avatar_default"/>  
  56.     </RelativeLayout>  
  57.   
  58. </LinearLayout>  

每一条消息的布局文件

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation="vertical">  
  6.   
  7.     <RelativeLayout  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:paddingBottom="7dip"  
  11.         android:paddingTop="7dip">  
  12.           
  13.         <ImageView  
  14.             android:id="@+id/iv_message_to_head_image"  
  15.             android:layout_alignParentLeft="true"  
  16.             android:layout_marginLeft="5dp"  
  17.             android:layout_marginRight="5dp"  
  18.             android:layout_width="40dp"  
  19.             android:layout_height="40dp"  
  20.             android:src="@drawable/slide_left_avatar_default"/>  
  21.   
  22.         <TextView  
  23.             android:id="@+id/tv_message_to"  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content"  
  26.             android:background="@drawable/icon_message_to"  
  27.             android:gravity="center"  
  28.             android:paddingLeft="20dip"  
  29.             android:textColor="@color/register_text_color"  
  30.             android:layout_toRightOf="@+id/iv_message_to_head_image"  
  31.             android:layout_marginRight="55dp"  
  32.             android:textSize="16dip"/>  
  33.   
  34.         <TextView  
  35.             android:id="@+id/tv_message_from"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="wrap_content"  
  38.             android:layout_toLeftOf="@+id/iv_message_from_head_image"  
  39.             android:background="@drawable/icon_message_from"  
  40.             android:gravity="center"  
  41.             android:paddingRight="20dip"  
  42.             android:textColor="@color/white_normal"  
  43.             android:layout_marginLeft="55dp"  
  44.             android:text="我已经吃过了"  
  45.             android:textSize="16dip"/>  
  46.           
  47.         <!--          -->  
  48.         <ImageView  
  49.             android:id="@+id/iv_message_from_head_image"  
  50.             android:layout_alignParentRight="true"  
  51.             android:layout_marginLeft="5dp"  
  52.             android:layout_marginRight="5dp"  
  53.             android:layout_width="40dp"  
  54.             android:layout_height="40dp"  
  55.             android:src="@drawable/slide_left_avatar_default"/>  
  56.     </RelativeLayout>  
  57.   
  58. </LinearLayout>  


弹出删除按钮的布局文件

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <TextView  
  7.         android:id="@+id/tv_delete"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:background="@drawable/icon_private_message_delete"  
  11.         android:gravity="center_horizontal"  
  12.         android:padding="5dp"  
  13.         android:text="删除"  
  14.         android:textColor="#ffffffff" />  
  15.   
  16. </FrameLayout>  

点击链接下载源码

目录
相关文章
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
97 0
|
3月前
|
安全 Linux Android开发
Android 安全功能
Android 安全功能
37 0
|
4月前
|
传感器 物联网 Android开发
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
62 1
|
4月前
|
XML Java 定位技术
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
112 0
|
4月前
|
XML 前端开发 Java
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
33 1
|
4月前
|
JSON 语音技术 Android开发
【Android App】在线语音识别功能实现(使用云知声平台与WebSocket 超详细 附源码)
【Android App】在线语音识别功能实现(使用云知声平台与WebSocket 超详细 附源码)
34 0
|
4月前
|
JSON Java 语音技术
【Android App】实现在线语音合成功能(使用云知声平台和WebSocket 超详细 附源码)
【Android App】实现在线语音合成功能(使用云知声平台和WebSocket 超详细 附源码)
43 0
|
Java Android开发 开发者
Android 悬浮窗功能的实现
Android 悬浮窗功能的实现
1205 2
Android 悬浮窗功能的实现
|
Android开发 容器 数据格式
Android 购物车功能的实现
首先,众所周知,ListView是Android最常用的控件,可以说是最简单的控件,也可以说是最复杂的控件。 作为一个Android初级开发者,可能会简单的ListView展示图文信息。 作为一个有一定项目开发经验的Android开发者来说,可能会遇到ListView的列表项中存在各种按钮的需求。
1124 0