Android仿qq聊天记录长按删除功能效果
来源:互联网 发布:nosql与mysql的区别 编辑:程序博客网 时间:2024/05/22 07:49
最近项目在做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" > <ListView android: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> <include android: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"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="7dip" android:paddingTop="7dip"> <ImageView android: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"/> <TextView android: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"/> <TextView android: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"/> <!-- --> <ImageView android: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"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="7dip" android:paddingTop="7dip"> <ImageView android: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"/> <TextView android: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"/> <TextView android: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"/> <!-- --> <ImageView android: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" > <TextView android: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>
点击链接下载源码
0 1
- Android仿qq聊天记录长按删除功能效果
- Android仿qq聊天记录待定与删除功能效果
- Android仿QQ聊天记录待定与删除功能效果
- Android仿QQ聊天记录待定与删除功能效果
- Android仿QQ长按删除弹出框
- Android仿QQ长按删除弹出框
- 仿QQ长按弹出功能菜单
- 仿QQ长按弹出功能菜单
- 仿android手机qq消息列表中删除按钮效果
- 仿android手机qq消息列表中删除按钮效果
- Android仿QQ消息列表ListView滑动删除效果
- Android ListView侧滑item,仿QQ删除效果
- Android仿QQ侧滑(删除、置顶等)功能
- android 仿qq的侧滑删除功能
- 类似于QQ的聊天记录的侧滑删除功能
- Android仿qq健康效果
- Android 仿QQ 滑动删除
- android 仿QQ微信侧滑删除
- Unable to convert data to string around character 11.
- 代码生成器:Java自动生成service,serviceImpl及action
- 使用POI在线预览Word
- 南邮 OJ 1053 恶魔城
- java单分派与多分派(多路分发和单路分发)
- Android仿qq聊天记录长按删除功能效果
- linux系统644、755、777权限详解
- HDU 3473 Minimum Sum (划分树)
- php关于url、文件、目录、ip的相关问题汇总
- C#泛型集合
- python3入门之赋值语句介绍
- 南邮 OJ 1054 回文回文!
- uva 10935 卡片游戏【队列】
- 【bzoj3620】 似乎在梦中见过的样子 KMP