最近项目在做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; @Override protected 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); } @Override public int getCount() { return messages.size(); } @Override public Object getItem(int position) { return messages.get(position); } @Override public long getItemId(int position) { return position; } @Override public 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() { @Override public 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() { @Override public 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>
点击链接下载源码