上一篇仿QQ做了两个人的聊天界面,下面再仿QQ做一下群聊天。分为三个步骤:加群,列出已加入的群,群聊天。以下以群主是别人为例(QQ上就把“我创建的群”单独列出来了,其实道理是一样的,这里就不赘述了)。
本例为初步布局,主要实现了功能,布局不好看还望见谅
首先还是先设计好数据库:
一一介绍一下,这里qunname为群名称,own为群主,这两个作为约束条件,唯一标示一个群。intro为这个群的简介,per_sum为这个群的总人数,per为群成员,qq为消息,time为发信息的时间。
一、加群:截图如下
1.先写好布局R.layout.main
<?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">
<LinearLayout
android:id="@+id/top"
android:background="@color/pink"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="50dip">
<TextView
android:textStyle="bold"
android:textSize="15sp"
android:text="兴趣贴吧"
android:layout_width="wrap_content"
android:layout_height="50dip" />
</LinearLayout>
<ListView
android:layout_above="@+id/create"
android:layout_below="@+id/top"
android:id="@+id/mylistview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"></ListView>
<Button
android:layout_alignParentBottom="true"
android:background="@drawable/landbtn_shape"
android:text="创建新的群组"
android:id="@+id/create"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
2.再准备好辅助类:
package com.example.administrator.myapplication; /** * Created by Administrator on 2016/12/28. */ public class Qun { private String qunname;//群名称 private boolean flag;//我是否已加入该群 private String per_sum;//群总人数
private String name;//我的名字
private String own;//群主
private String intro;//群简介
public void setIntro(String intro){
this.intro=intro;
}
public String getIntro(){
return this.intro;
}
public void setQunname(String qunname){
this.qunname=qunname;
}
public String getQunname(){
return this.qunname;
}
public void setFlag(boolean flag){
this.flag=flag;
}
public boolean getFlag(){
return this.flag;
}
public void setPer_sum(String per_sum){
this.per_sum=per_sum;
}
public String getPer_sum(){
return this.per_sum;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setOwn(String own){
this.own=own;
}
public String getOwn(){
return this.own;
}
}
3.设计好adapter用于填充listview:
package com.example.administrator.myapplication; import android.app.Activity; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; /** * Created by Administrator on 2016/12/28. */ public class QunAdapter extends BaseAdapter { private ArrayList<Qun> list=new ArrayList<Qun>(); private Qun qun; private String qunname; private boolean flag; private String per_sum; private Activity context; private LayoutInflater layoutInflater; private MyOpenHelper myopenhelper; private SQLiteDatabase sqlite; private String name; private String own; public QunAdapter(ArrayList<Qun> list,Activity context){ this.list=list; this.context=context; this.layoutInflater=context.getLayoutInflater(); myopenhelper=new MyOpenHelper(context); sqlite=myopenhelper.getReadableDatabase(); } @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(final int position, View convertView, ViewGroup parent) { ViewHolder viewHolder=new ViewHolder(); qun=list.get(position); qunname=qun.getQunname(); per_sum=qun.getPer_sum(); flag=qun.getFlag(); name=qun.getName(); own=qun.getOwn(); if(convertView==null){ convertView=layoutInflater.inflate(R.layout.qunview,null); viewHolder.qunname=(TextView)convertView.findViewById(R.id.qunname); viewHolder.per_sum=(TextView)convertView.findViewById(R.id.per_sum); viewHolder.btn=(Button)convertView.findViewById(R.id.add); convertView.setTag(viewHolder); }else{ viewHolder=(ViewHolder)convertView.getTag(); } viewHolder.qunname.setText(qunname); viewHolder.per_sum.setText(per_sum+"人"); if(flag){ viewHolder.btn.setEnabled(true); viewHolder.btn.setText("添加此群"); }else{ viewHolder.btn.setEnabled(false); viewHolder.btn.setText("已加入此群"); } viewHolder.btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String sum_ = list.get(position).getPer_sum(); String qunname_ = list.get(position).getQunname(); String own_ = list.get(position).getOwn(); String intro=list.get(position).getIntro(); ContentValues cont = new ContentValues(); String sum = String.valueOf(Integer.parseInt(sum_) + 1);//群创建时里面默认只有群主一人,以后每加一个,总数加1 cont.put("qunname",qunname_); cont.put("own",own_); cont.put("intro",intro); cont.put("per",name);//我进群 cont.put("per_sum", sum);
long a=sqlite.insert("qun",null,cont); ContentValues content=new ContentValues(); content.put("per_sum",sum); int b=sqlite.update("qun",content,"area=? and homename=? and qunname=? and own=? and intro=?", new String[]{area,hoamame,qunname_,own_,intro}); if(a>0 && b>0){
Toast.makeText(context, "已添加此群,可在我的 群组中查看", Toast.LENGTH_SHORT).show(); } } }); return convertView; } private class ViewHolder{ public TextView qunname; public TextView per_sum; public Button btn; }}
4.编写主操作类:
package com.example.administrator.myapplication; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by Administrator on 2016/12/29. */ public class Main extends Activity { private String qunname; private String per_sum; private Qun qun; private static final String FileName = "MyFile"; private String name; private ListView mylistview; private QunAdapter qunAdapter; private MyOpenHelper myOpenHelper; private SQLiteDatabase sqLiteDatabase; private ArrayList<Qun> list = new ArrayList<Qun>(); private SharedPreferences share; private String own; private boolean flag=true; private String intro; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mylistview=(ListView)super.findViewById(R.id.mylistview); share = this.getSharedPreferences(FileName, Activity.MODE_PRIVATE); name = share.getString("name", "");//用户名,我自己 myOpenHelper=new MyOpenHelper(this); sqLiteDatabase=myOpenHelper.getReadableDatabase(); Cursor cursor=sqLiteDatabase.rawQuery("select DISTINCT qunname,own,intro from qun" ,null);//查询所有的群信息 for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { qunname=cursor.getString(0); own=cursor.getString(1); intro=cursor.getString(2); Cursor cursor1=sqLiteDatabase.rawQuery("select DISTINCT per,per_sum" + " from qun where qunname=? and own=? ", new String[]{qunname,own}); for (cursor1.moveToFirst(); !cursor1.isAfterLast(); cursor1.moveToNext()){ //查询该群成员有没有我 String name_=cursor1.getString(0); per_sum=cursor1.getString(1); if(name.equals(name_)){ flag=false; break; //有我,退出循环 } } qun=new Qun(); qun.setName(name); qun.setOwn(own); qun.setQunname(qunname); qun.setFlag(flag); qun.setPer_sum(per_sum); qun.setIntro(intro); list.add(qun); } qunAdapter=new QunAdapter(list,Main.this); mylistview.setAdapter(qunAdapter); cursor.close(); } }
二、列出已加入的群:用listview列出已加入的群,这里可以简单地用simpleAdapter来填充这个listview
Cursor cursor=sqLiteDatabase.rawQuery("select DISTINCT qunname,own,intro,per_sum" + " from qun where per=?", new String[]{name});
//这里name为我的登录帐号
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Map<String,String> map=new HashMap<String,String>();
String qunname=cursor.getString(0);
String own=cursor.getString(1);
String intro=cursor.getString(2);
String per_sum=cursor.getString(3);
map.put("qunname",qunname);
map.put("own",own);
map.put("intro",intro);
map.put("per_sum",per_sum);
list.add(map);
}
simpleAdapter=new SimpleAdapter(this,list,R.layout.qun_list,new String[]{"qunname"},new int[]{R.id.qunname});
listView.setAdapter(simpleAdapter);
listView.setOnItemClickListener(new jion()); //Item单击事件,单击后进入群就可以聊天啦。
三、群聊天
1.布局R.layout.chat
<?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"> <LinearLayout android:id="@+id/top" android:layout_alignParentTop="true" android:orientation="horizontal" android:background="@color/pink" android:layout_width="fill_parent" android:layout_height="70dip"> <TextView android:layout_gravity="center" android:gravity="center" android:id="@+id/qunname" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/btn" android:text="群详情" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <RelativeLayout android:layout_alignParentBottom="true" android:id="@+id/bottom" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:onClick="send" android:background="@drawable/btn_sub" android:id="@+id/sub" android:text="发送" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:id="@+id/msg" android:layout_toLeftOf="@+id/sub" android:background="@drawable/edit" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </RelativeLayout> <ListView android:id="@+id/listview" android:layout_above="@+id/bottom" android:layout_below="@+id/top" android:layout_width="fill_parent" android:layout_height="wrap_content"></ListView> </RelativeLayout>
2.辅助类和adapter(详见上一篇博客http://blog.csdn.net/w_t_y_y/article/details/60466575)
3.主操作类:
package com.example.administrator.myapplication; import android.app.Activity; import android.content.ContentValues; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; import java.util.ArrayList; /** * Created by Administrator on 2016/12/29. */ public class Qun_Chat extends Activity{ private TextView qunname; private SharedPreferences sharedPreferences; private MyOpenHelper myOpenHelper; private SQLiteDatabase sqLiteDatabase; private String name; private String qunname_; private String own_; private static final String FileName = "MyFile"; private EditText msg; private Button sub; private String time_; private String intro_; private String per_sum; private ListView listview; private ArrayList<Chat> list=new ArrayList<Chat>(); private MyListViewAdapter mylistviewAdapter; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chat); bind(); init(); } public void bind(){ qunname=(TextView)super.findViewById(R.id.qunname); msg=(EditText)super.findViewById(R.id.msg); sub=(Button)super.findViewById(R.id.sub); listview=(ListView)super.findViewById(R.id.listview); sharedPreferences=super.getSharedPreferences(FileName, MODE_PRIVATE); name=sharedPreferences.getString("name",""); myOpenHelper=new MyOpenHelper(this); sqLiteDatabase=myOpenHelper.getReadableDatabase(); Class_Qun people = (Class_Qun) this.getIntent().getSerializableExtra("app"); qunname_ = people.getQunanme(); own_=people.getOwn(); intro_=people.getIntro(); per_sum=people.getPer_name(); DatePicker data = new DatePicker(this); TimePicker time = new TimePicker(this); time.setIs24HourView(true);
time_= (data.getMonth() + 1) + "-" + data.getDayOfMonth() + "-" + time.getCurrentHour() + "-" + time.getCurrentMinute();
}
public void init() {
//加载消息
Cursor cursor = sqLiteDatabase.query("qun", new String[]{"qq", "time", "per"},
"qunname=? and own=?",
new String[]{ qunname_, own_}, null, null, null);
if (cursor.getCount() > 0) {
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(name)) {//我
chat.setname(flag);
chat.setlay(false);
} else {
chat.setname(flag);
chat.setlay(true);
}
list.add(chat);
}
mylistviewAdapter = new MyListViewAdapter(Qun_Chat.this, list);
listview.setAdapter(mylistviewAdapter);
}
}
public void send(View view){
String massage=msg.getText().toString();
if(massage.length()>=1){
ContentValues cont=new ContentValues();
cont.put("qunname",qunname_);
cont.put("own",own_);
cont.put("intro",intro_);
cont.put("per_sum",per_sum);
cont.put("per",name);
cont.put("qq",massage);
cont.put("time",time_);
long a=sqLiteDatabase.insert("qun",null,cont);
Chat chat = new Chat();
chat.settime(time_);
chat.setname(name);
chat.settext(massage);
chat.setlay(false);
list.add(chat);
mylistviewAdapter.notifyDataSetChanged();
msg.setText("");
}
}
}
就写到这里了,以上群主都是别人,非"我”(即当前登录方),如果加上"我创建的群"这个功能,只要把"我"的名字插进own这个字段就可以了,这里就不再赘述了。