使用listview实现聊天界面如下:
实现聊天界面的的方法可以在定义baseAdapter的时候重写getItemViewType()方法返回第positon个Item是何种类型,重写getVIewTypeCount()方法来返回不同的布局总数,在获取布局的时候,判断一下该获取哪一种布局就可以了。也可以定义两个布局来实现消息的显示和隐藏,这里我使用的是第一种。
要注意的是,在布局界面中还要制作一个可拉升的9patch图片。下面是布局文件的代码 ,我只上传收消息的布局,宁外一个类似
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
>
<ImageView
android:id="@+id/iconLeft"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/icon2"/>
<TextView
android:id="@+id/textLeft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/chatitem_in_bg"
android:gravity="center"
android:textSize="20sp"
/>
</LinearLayout>
然后定义消息的实体类Message
public class Message {
private int type;
private String content;
private Bitmap icon;
public Message() {
}
public Message(int type, String content, Bitmap icon) {
this.type = type;
this.content = content;
this.icon = icon;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Bitmap getIcon() {
return icon;
}
public void setIcon(Bitmap icon) {
this.icon = icon;
}
}
定义MessageAdapter 继承BaseAdapter,重写getItemViewType(),getVIewTypeCount()方法
public class MessageAdapter extends BaseAdapter {
private ArrayList<Message> msgList;
private LayoutInflater mInflater;
public MessageAdapter(ArrayList<Message> msgList,Context context){
this.msgList = msgList;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return msgList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
Message msg = msgList.get(position);
return msg.getType();
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
if(convertView == null){
if(getItemViewType(position) == 0){
view = mInflater.inflate(R.layout.chat_left,null);
viewHolder = new ViewHolder();
viewHolder.icon = (ImageView)view.findViewById(R.id.iconLeft);
viewHolder.text = (TextView)view.findViewById(R.id.textLeft);
}else {
view = mInflater.inflate(R.layout.chat_right,null);
viewHolder = new ViewHolder();
viewHolder.icon = (ImageView)view.findViewById(R.id.iconRight);
viewHolder.text = (TextView)view.findViewById(R.id.textRight);
}
view.setTag(viewHolder);
}else {
view = convertView;
viewHolder = (ViewHolder)view.getTag();
}
viewHolder.icon.setImageBitmap(msgList.get(position).getIcon());
viewHolder.text.setText(msgList.get(position).getContent());
return view;
}
static class ViewHolder{
ImageView icon;
TextView text;
}
}
最后在MainActivity中添加测试数据,其中的send方法实现点击按钮可以发送消息
public class MainActivity extends Activity {
private ArrayList<Message> msgList;
private MessageAdapter mAdapter;
EditText chatEditView;
ListView chatListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chatListView = (ListView) findViewById(R.id.chatListView);
chatEditView = (EditText)findViewById(R.id.chatEditText);
msgList = new ArrayList<>();
initMessage();
mAdapter = new MessageAdapter(msgList,MainActivity.this);
chatListView.setAdapter(mAdapter);
}
public void send(View v){
String content = chatEditView.getText().toString();
if(!"".equals(content)){
Message message = new Message(1,content, BitmapFactory.decodeResource(getResources(),R.drawable.icon1));
msgList.add(message);
mAdapter.notifyDataSetChanged();
chatListView.setSelection(msgList.size());
chatEditView.setText("");
}
}
private void initMessage(){
Message message1 = new Message(0,"宋慧乔是我女神", BitmapFactory.decodeResource(getResources(),R.drawable.icon2));
msgList.add(message1);
Message message2 = new Message(1,"宋钟基是我男神",BitmapFactory.decodeResource(getResources(),R.drawable.icon1));
msgList.add(message2);
Message message3 = new Message(0,"呵呵",BitmapFactory.decodeResource(getResources(),R.drawable.icon2));
msgList.add(message3);
Message message4 = new Message(1,"呵呵",BitmapFactory.decodeResource(getResources(),R.drawable.icon1));
msgList.add(message4);
Message message5 = new Message(0,"我错了", BitmapFactory.decodeResource(getResources(),R.drawable.icon2));
msgList.add(message5);
}
}
本文介绍了如何利用ListView实现聊天界面,重点在于在baseAdapter中重写getItemViewType()和getViewTypeCount()方法来处理不同类型的布局。同时,提到了需要创建可拉伸的9patch图片作为布局的一部分,并给出了收消息布局的XML代码示例。此外,还定义了Message实体类和MessageAdapter,并在MainActivity中填充测试数据并实现发送消息的功能。
2360

被折叠的 条评论
为什么被折叠?



