Android仿qq聊天記錄長按刪除功能效果


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

點擊鏈接下載源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM