本人一直忙于做项目,以至于没有时间整理自己的博客,近来偷得半日闲,特来装饰 (充实)一下自己的空间。
首先上图:
下面进入正题:
一、辅助类准备
package com.example.administrator.myapplication;
public class Chat {
private String time;//消息发送的时间
private String name;//消息发送方
private String text;//消息内容
private boolean lay;//标志,该消息来自于谁
//时间
public void settime(String time) {
this.time = time;
}
public String gettime(){
return time;
}
//姓名
public void setname(String name) {
this.name = name;
}
public String getname(){
return name;
}
//消息
public void settext(String text) {
this.text = text;
}
public String gettext(){
return text;
}
//布局
public void setlay(boolean lay) {
this.lay= lay;
}
public boolean getlay(){
return lay;
}
}
二、后台工作:
1.数据库准备
这里applyor为申请人,friends为被申请人,isok默认为0,当friends同意了applyor的申请,isok更新(update)为1,表示两人成为好友,接下来qq为发送的消息,time为发送的时间,flag表示消息来自于谁。
首先从数据库加载历史消息,得有个查找条件吧,不然岂不是把和所有人的聊天信息都查出来了。这里可以假设我是applyor,那么:
Cursor cursor = sqLiteDatabase.query("friend", new String[]{"qq","time","flag"}, " applyor=? and friends=? and isok=?", new String[]{me,friends,"1"}, null, null, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String qq = cursor.getString(0);
String time1=cursor.getString(1);
String flag=cursor.getString(2);
Chat chat=new Chat();
//设置时间
chat.settime(time1);
//设置消息
chat.settext(qq);
//设置姓名和布局
if(flag.equals("1")){//消息是我发的
chat.setname(me);
chat.setlay(false);
}else{//消息是对方发的
chat.setname(friends);
chat.setlay(true);
}
alllist.add(chat);
}
myListViewAdapter=new MyListViewAdapter(Friend_chat.this,alllist);
wechat_listview.setAdapter(myListViewAdapter);
}
2.重点就在于这个myListViewAdapter了:
package com.example.administrator.myapplication; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2016/10/30. */ public class MyListViewAdapter extends BaseAdapter { private Context context; private List<Chat> list=new ArrayList<Chat>(); private LayoutInflater inflater; //构造函数,传递参数 public MyListViewAdapter(Context context, List<Chat> list){ this.context=context; this.list=list; this.inflater= LayoutInflater.from(context); } //以下不可以缺少,否则布局不对 public static interface IMsgViewType { int IMVT_COM_MSG = 0; int IMVT_TO_MSG = 1; } public int getItemViewType(int position) { // TODO Auto-generated method stub Chat entity = list.get(position); if (entity.getlay()) { return IMsgViewType.IMVT_COM_MSG; } else { return IMsgViewType.IMVT_TO_MSG; } } public int getViewTypeCount() { // TODO Auto-generated method stub return 2; } //以上不可以缺少,否则布局不对 @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final Chat chat=list.get(position); boolean lay=chat.getlay(); ViewHolder viewHolder=null; if (convertView==null){ //还没有多余的item布局 if (lay==true){//左布局 convertView = inflater.inflate(R.layout.chat_left, null); }else{//右布局 convertView = inflater.inflate(R.layout.chat_right, null); } viewHolder=new ViewHolder(); viewHolder.time=(TextView)convertView.findViewById(R.id.time); viewHolder.text=(TextView)convertView.findViewById(R.id.text); viewHolder.pername=(TextView)convertView.findViewById(R.id.pername); viewHolder.isComMsg=lay; convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.time.setText(chat.gettime()); viewHolder.text.setText(chat.gettext()); viewHolder.pername.setText(chat.getname()); return convertView; } static class ViewHolder{ public TextView time; public TextView text; public TextView pername; public boolean isComMsg = true; } }
这里的chat_left:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
>
<TextView
android:layout_centerHorizontal="true"
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_below="@+id/time"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/t1"
android:layout_alignParentLeft="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/tp"
android:src="@drawable/hua"
android:layout_width="50dp"
android:layout_height="50dp" />
<TextView
android:layout_below="@+id/tp"
android:id="@+id/pername"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
<TextView
android:background="@drawable/chatfrom_bg_focused"
android:layout_toRightOf="@+id/t1"
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</RelativeLayout>
相同的,chat_right只是图片的位置不同而已:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
>
<TextView
android:layout_centerHorizontal="true"
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_below="@+id/time"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/t1"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/tp"
android:src="@drawable/shan"
android:layout_width="50dip"
android:layout_height="50dip" />
<TextView
android:layout_below="@+id/tp"
android:id="@+id/pername"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
<TextView
android:background="@drawable/chatto_bg_focused"
android:layout_toLeftOf="@+id/t1"
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</RelativeLayout>
思路就是这样,因为是左右两个布局,所以写了chat_left和chat_right两个layout文件,然后设个flag(即Chat里面的lay)来选择要用的布局,而这个flag又是怎么插进数据库的呢?
3.请看下面的代码:
public void Send(View view) {//图中的发送按钮点击事件
String mass= Friend_chat.this.massage.getText().toString();
String m_assage =mass;
if (m_assage.length() >= 1){
send.setEnabled(true);
ContentValues contentValues = new ContentValues();
contentValues.put("applyor",friends);
contentValues.put("friends",name);
contentValues.put("isok","1");
contentValues.put("qq", m_assage);
contentValues.put("time", shijian);
contentValues.put("flag","1");//这里消息是我发的,代表自己说的
long a = sqLiteDatabase.insert("friend", null, contentValues);
ContentValues contentValues1=new ContentValues();
contentValues1.put("applyor",name);//上面说了,查询的时候条件设为我是applyor,所以插入两次,第一次保证我发的消息在我这边能看到,第二次保证我发的消息对方也能看到,反之对方发的消息也是这个道理(因为这个我是相对的,表示当前登录方)。
contentValues1.put("friends",friends);
contentValues1.put("isok","1");
contentValues1.put("qq", m_assage);
contentValues1.put("time", shijian);
contentValues1.put("flag","0");//放到对方那边,我的身份是朋友
long b = sqLiteDatabase.insert("friend", null, contentValues1);
//if((a>0) && (b>0)) Toast.makeText(Friend_chat.this, "发送成功", Toast.LENGTH_SHORT).show();
Chat chat = new Chat();
chat.settime(shijian);
chat.setname(name);
chat.settext(m_assage);
chat.setlay(false);
alllist.add(chat);
myListViewAdapter.notifyDataSetChanged();
Friend_chat.this.massage.setText(" ");
}
}