最近项目在做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>
时间: 2024-12-31 04:20:55