1)编写一个聊天界面,用LIstView来显示聊天的消息内容,用EditText来输入消息,用Button来发送消息。在activity_main.xml中:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/image2" android:orientation="vertical" tools:context="com.example.administrator.myapplication.MainActivity"> <ListView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/msg_list_view" android:divider="#000" > </ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/input_text" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="Type something here" android:maxLines="2"/> <Button android:id="@+id/send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" android:textAllCaps="false"/> </LinearLayout> </LinearLayout>
2)新建一个Msg类,content表示消息的内容,type表示消息的类型。
package com.example.administrator.myapplication; /** * Created by Administrator on 2016/7/14. */ public class Msg { public static final int TYPE_RECEIVED=0; public static final int TYPE_SENT=1; private String content; private int type; public Msg(String content,int type){ this.content=content; this.type=type; } public String getContent(){ return content; } public int getType(){ return type; } }3)编写ListView子项的布局,新建msg_item.xml,其中收到的消息左对齐,发出的消息右对齐<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp"> <LinearLayout android:id="@+id/left_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:background="@drawable/image1" > <TextView android:id="@+id/left_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" /> </LinearLayout> <LinearLayout android:id="@+id/right_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:background="@drawable/image4" > <TextView android:id="@+id/right_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" /> </LinearLayout> </LinearLayout>4)创建ListVie的适配器类,让它继承自ArrayAdapter,并将泛型指定为Msg类。新建类MsgAdapterpackage com.example.administrator.myapplication; import android.content.Context; import android.support.v4.widget.ViewDragHelper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.TextView; import java.util.List; /** * Created by Administrator on 2016/7/14. */ public class MsgAdapter extends ArrayAdapter<Msg> { private int resourceId; public MsgAdapter(Context context, int textViewResourceId, List<Msg> objects){ super(context,textViewResourceId,objects); resourceId=textViewResourceId; } @Override public View getView(int position, View convertView, ViewGroup parent){ Msg msg=getItem(position); View view; ViewHolder viewHolder; //ViewHolder,用于对控件的实例进行缓存 if(convertView==null){ //convertView用于将之前加载好的布局进行缓存,以便之后可以进行重用。 view= LayoutInflater.from(getContext()).inflate(resourceId,null); viewHolder=new ViewHolder(); viewHolder.leftLayout=(LinearLayout) view.findViewById(R.id.left_layout); viewHolder.rightLayout=(LinearLayout) view.findViewById(R.id.right_layout); viewHolder.leftMsg=(TextView) view.findViewById(R.id.left_msg); viewHolder.rightMsg=(TextView) view.findViewById(R.id.right_msg); view.setTag(viewHolder); }else{ view=convertView; viewHolder=(ViewHolder) view.getTag(); } if (msg.getType()==Msg.TYPE_RECEIVED){ //如果是收到消息,则显示左边的消息布局,将右边的消息布局隐藏 viewHolder.leftLayout.setVisibility(View.VISIBLE); viewHolder.rightLayout.setVisibility(View.GONE); viewHolder.leftMsg.setText(msg.getContent()); }else if(msg.getType()==Msg.TYPE_SENT){ viewHolder.rightLayout.setVisibility(View.VISIBLE); viewHolder.leftLayout.setVisibility(View.GONE); viewHolder.rightMsg.setText(msg.getContent()); } return view; } class ViewHolder{ LinearLayout leftLayout; LinearLayout rightLayout; TextView leftMsg; TextView rightMsg; } }5)在 MainActivity中,为ListView初始化一些数据,并给发送按钮添加事件响应package com.example.administrator.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.ListViewCompat; import android.view.View; import android.view.Window; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView msgListView; private EditText inputText; private Button send; private MsgAdapter adapter; private List<Msg> msgList=new ArrayList<Msg>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initMsgs(); adapter=new MsgAdapter(MainActivity.this,R.layout.msg_item,msgList); inputText=(EditText)findViewById(R.id.input_text); send=(Button)findViewById(R.id.send); msgListView=(ListView)findViewById(R.id.msg_list_view); msgListView.setAdapter(adapter); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String content=inputText.getText().toString(); if(!"".equals(content)){ Msg msg=new Msg(content,Msg.TYPE_SENT); msgList.add(msg); adapter.notifyDataSetChanged(); msgListView.setSelection(msgList.size()); inputText.setText(""); } } }); } private void initMsgs(){ Msg msg1=new Msg("在干嘛?",Msg.TYPE_RECEIVED); msgList.add(msg1); Msg msg2=new Msg("没事,很无聊。你呢?",Msg.TYPE_SENT); msgList.add(msg2); Msg msg3=new Msg("没事,就是想你!",Msg.TYPE_RECEIVED); msgList.add(msg3); } }运行效果图: