ListView仿QQ群聊天

上一篇仿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这个字段就可以了,这里就不再赘述了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_t_y_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值