android-对话式聊天效果实现

本文介绍了一种在Android应用中实现对话式聊天界面的方法。通过创建两种不同布局的XML文件来区分发送者与接收者的消息,并结合自定义的Adapter及ChatMsg类实现了消息的展示效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用android的短信息软件如有米短信,微信等,都有对话式的聊天效果,个人感觉挺好的,现在简单模仿实现下。
效果如下:







为了实现这种效果,需要弄两个不同的xml布局文件

我:list_say_me_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  >
  <ImageView
      android:layout_width="42px"
      android:layout_height="42px"
      android:layout_gravity="bottom"
      android:id="@+id/messagegedetail_rov_icon"
      android:background="@drawable/image1"
  />
  <LinearLayout
      android:orientation="vertical"
      android:layout_width="249dp"
      android:layout_height="wrap_content"
      android:background="@drawable/incoming"
      android:layout_marginLeft="5dp"
  >    
      <LinearLayout
          android:orientation="horizontal"
	      android:layout_width="fill_parent"
	      android:layout_height="22dip"
      >
          <TextView
              android:id="@+id/messagedetail_row_name"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textColor="#000000"
              android:paddingTop="2px"
              android:textSize="16dip"
          />
          <TextView
              android:id="@+id/messagedetail_row_date"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textColor="#000000"
              android:paddingTop="2px"
              android:textSize="16dip"
              android:layout_marginLeft="60dip"
          />
          </LinearLayout>
      <TextView
          android:id="@+id/messagedetail_row_text"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:paddingLeft="2px"
          android:textColor="#0000DD"
          android:textSize="16dip"
      />
  </LinearLayout>
</LinearLayout>

对方:list_say_he_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:layout_marginLeft="10px"
  >
  <LinearLayout
      android:orientation="vertical"
      android:layout_width="249px"
      android:layout_height="wrap_content"
      android:background="@drawable/outgoing"
      android:layout_marginLeft="25px"
  >    
      <LinearLayout
          android:orientation="horizontal"
	      android:layout_width="fill_parent"
	      android:layout_height="22dip"
      >
          <TextView
              android:id="@+id/messagedetail_row_name"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textColor="#000000"
              android:paddingTop="2px"
              android:textSize="16dip"
          />
          <TextView
              android:id="@+id/messagedetail_row_date"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textColor="#000000"
              android:paddingTop="2px"
              android:textSize="16dip"
              android:layout_marginLeft="60dip"
          />
          </LinearLayout>
      <TextView
          android:id="@+id/messagedetail_row_text"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:paddingLeft="2px"
          android:textColor="#0000DD"
          android:textSize="16dip"
      />
  </LinearLayout>
  <ImageView
      android:layout_width="42px"
      android:layout_height="42px"
      android:layout_gravity="bottom"
      android:id="@+id/messagegedetail_rov_icon"
      android:background="@drawable/image2"
  />
</LinearLayout>

主Activity文件:


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class ChatActivity extends Activity {
	private  ListView  talkView;
	private  Button  messageButton;
	private  EditText  messageText;
	private  ArrayList<ChatMsg>  list = new ArrayList<ChatMsg>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println("AAAAAAAAAA");
        init();
    }
    private void init(){
    	  talkView = (ListView) findViewById(R.id.list);
    	  messageButton = (Button) findViewById(R.id.MessageButton);
    	  messageText = (EditText) findViewById(R.id.MessageText);
    	  messageButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
			String  name = getName(R.string.myDisplayName);
			String  date  =getDate();
			String  msgText  =getText();
			int RIdA = R.layout.list_say_me_item;
			ChatMsg   newMsg = new ChatMsg(name,date,msgText,RIdA);
			list.add(newMsg);
			int RIdB = R.layout.list_say_he_item;
			String  othername = getName(R.string.otherDisplayName);
			ChatMsg   backMsg = new ChatMsg(othername,date,"自动回复(for test!)",RIdB);
			list.add(backMsg);
			talkView.setAdapter(new ChatMsgViewAdapter(ChatActivity.this,list));
			messageText.setText("");
			}
		}) ; 
    }
    private  String getName(int id){
    	return getResources().getString(id);
    }
    private   String  getDate(){
    	SimpleDateFormat  sdf  =new SimpleDateFormat("MM-dd HH:mm");
    	Date  d = new Date();
    	return   sdf.format(d);
    }
    private  String  getText(){
    	return messageText.getText().toString();
    }
    @Override
    protected void onDestroy() {
    	// TODO Auto-generated method stub
    	super.onDestroy();
    }
}

Adapter:



import java.util.ArrayList;

import android.content.Context;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ChatMsgViewAdapter extends BaseAdapter  {
    private static final String TAG = ChatMsgViewAdapter.class.getSimpleName();

    private  ArrayList<ChatMsg>  list;
    private  Context  context;
	public ChatMsgViewAdapter(Context  context,ArrayList<ChatMsg>  list) {
		this.context = context;
		this.list =    list;
	}
    public boolean areAllItemsEnabled() {
        return false;
    }

    public boolean isEnabled(int arg0) {
        return false;
    }
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}
	  public int getItemViewType(int position) {
	        return position;
	    }
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ChatMsg   msg = list.get(position);
		int itemlayout = msg.getLayoutID();
		LinearLayout   layout = new LinearLayout(context);
		LayoutInflater  vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		vi.inflate(itemlayout, layout,true);
		TextView  tvName = (TextView) layout.findViewById(R.id.messagedetail_row_name);
		tvName.setText(msg.getName());
		TextView tvDate  =(TextView) layout.findViewById(R.id.messagedetail_row_date);
		tvDate.setText(msg.getDate());
		TextView  tvText  =(TextView) layout.findViewById(R.id.messagedetail_row_text);
		tvText.setText(msg.getText());
		return layout;
	}
	public int getViewTypeCount() {
        return list.size();
    }

    public boolean hasStableIds() {
        return false;
    }

    public boolean isEmpty() {
        return false;
    }

    public void registerDataSetObserver(DataSetObserver observer) {
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
    }
}

ChatMsg:


public class ChatMsg {

    private  String  name;
    private  String  date;
    private  String text;
    private  int layoutID;
    public ChatMsg(String name,String date,String  text,int id) {
    	this.name=  name;
    	this.date = date;
    	this.text =text;
    	this.layoutID = id;
    }
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	public int getLayoutID() {
		return layoutID;
	}
	public void setLayoutID(int layoutID) {
		this.layoutID = layoutID;
	}

}



只是个效果显示,喜欢的朋友可以弄个socket聊天试试,O(∩_∩)O哈哈~





评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值