最近項目在做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>