基于百度云推送的实时通信客户端实现(二)

上一篇说了欢迎和登陆界面的实现,现在来说一下关于聊天界面的搭建,整体界面采用了一个ListView,主要的布局很简单,在这里使用了ListView自定义是Adapter的写法

同时,我构造了一个TaliListInfo的类来和Adapter对应

闲话不多说,直接上代码

  1 package com.demo.Adapter;
  2 
  3 import java.util.List;
  4 
  5 import com.tuisong.R;
  6 
  7 import android.content.Context;
  8 import android.database.DataSetObserver;
  9 import android.view.LayoutInflater;
 10 import android.view.View;
 11 import android.view.ViewGroup;
 12 import android.widget.BaseAdapter;
 13 import android.widget.LinearLayout;
 14 import android.widget.TextView;
 15 
 16 public class NewAdapterView extends BaseAdapter {
 17 
 18     @SuppressWarnings("unused")
 19     private static final String TAG = NewAdapterView.class.getSimpleName();
 20 
 21     private List<MessageEnity> coll;
 22 
 23     private Context context;
 24 
 25     // 构造函数
 26     public NewAdapterView(Context context, List<MessageEnity> list) {
 27         this.context = context;
 28         this.coll = list;
 29     }
 30 
 31     public boolean areAllItemsEnabled() {
 32         return false;
 33     }
 34 
 35     public boolean isEnabled(int arg0) {
 36         return false;
 37     }
 38 
 39     @Override
 40     public int getCount() {
 41         // TODO Auto-generated method stub
 42         return coll.size();
 43     }
 44 
 45     @Override
 46     public Object getItem(int arg0) {
 47         // TODO Auto-generated method stub
 48         return coll.get(arg0);
 49     }
 50 
 51     @Override
 52     public long getItemId(int arg0) {
 53         // TODO Auto-generated method stub
 54         return arg0;
 55     }
 56 
 57     public int getItemViewType(int position) {
 58         return position;
 59     }
 60 
 61     @Override
 62     public View getView(int positon, View convertView, ViewGroup parent) {
 63         // TODO Auto-generated method stub
 64         MessageEnity entity = coll.get(positon);
 65         int itemLayout = entity.getLayoutID();
 66 
 67         LinearLayout layout = new LinearLayout(context);
 68         LayoutInflater inflater = (LayoutInflater) context
 69                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 70         inflater.inflate(itemLayout, layout, true);
 71 
 72         TextView tvName = (TextView) layout.findViewById(R.id.person_name);
 73         tvName.setText(entity.getfromUser());
 74 
 75         TextView tvData = (TextView) layout.findViewById(R.id.time_say);
 76         tvData.setText(entity.getTime());
 77 
 78         TextView tvItem = (TextView) layout.findViewById(R.id.item_say);
 79         tvItem.setText(entity.getItem());
 80 
 81         return layout;
 82     }
 83 
 84     public int getViewTypeCount() {
 85         return coll.size();
 86     }
 87 
 88     public boolean hasStableIds() {
 89         return false;
 90     }
 91 
 92     public boolean isEmpty() {
 93         return false;
 94     }
 95 
 96     public void registerDataSetObserver(DataSetObserver observer) {
 97     }
 98 
 99     public void unregisterDataSetObserver(DataSetObserver observer) {
100     }
101 
102 }
NewAdapterView

Adapter的构造过程

 1 package com.demo.Adapter;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import com.tuisong.R;
 6 
 7 import android.content.Context;
 8 import android.util.Log;
 9 import android.view.LayoutInflater;
10 import android.view.View;
11 import android.view.ViewGroup;
12 import android.widget.BaseAdapter;
13 import android.widget.TextView;
14 
15 public class ListAdapter extends BaseAdapter {
16 
17     private Context context;
18     private List<TalkListInfo> talklist = new ArrayList<TalkListInfo>();
19     private LayoutInflater inflater = null;
20 
21     public ListAdapter(Context context, List<TalkListInfo> talklist) {
22         this.context = context;
23         this.talklist = talklist;
24         Log.d("create", "!!!");
25     }
26 
27     @Override
28     public int getCount() {
29         // TODO Auto-generated method stub
30         return talklist.size();
31     }
32 
33     @Override
34     public Object getItem(int arg0) {
35         // TODO Auto-generated method stub
36         return talklist.get(arg0);
37     }
38 
39     @Override
40     public long getItemId(int arg0) {
41         // TODO Auto-generated method stub
42         return arg0;
43     }
44 
45     @Override
46     public View getView(int arg0, View arg1, ViewGroup arg2) {
47         // TODO Auto-generated method stub
48 
49         inflater = LayoutInflater.from(this.context);
50         TalkHolder talk = new TalkHolder();
51         if (arg1 == null) {
52             talk = new TalkHolder();
53             arg1 = inflater.inflate(R.layout.talklistadapter, null);
54             talk.tv_name = (TextView) arg1.findViewById(R.id.tv_name);
55             talk.tv_time = (TextView) arg1.findViewById(R.id.tv_time);
56             talk.tv_item = (TextView) arg1.findViewById(R.id.tv_item);
57             arg1.setTag(talk);
58         } else {
59             talk = (TalkHolder) arg1.getTag();
60         }
61 
62         talk.tv_name.setText(talklist.get(arg0).getName());
63         talk.tv_time.setText(talklist.get(arg0).getDate());
64         talk.tv_item.setText(talklist.get(arg0).getItem());
65 
66         return arg1;
67     }
68 
69 }
70 
71 class TalkHolder {
72     public TextView tv_name;
73     public TextView tv_time;
74     public TextView tv_item;
75 }
ListAdapter

 同时,还需要写一个对应的布局来作为ListView的Adapter的布局

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="fill_parent"
 5     android:layout_height="wrap_content"
 6     android:background="#eeeeee"
 7     android:orientation="horizontal"
 8     tools:context="com.baidu.push.example.CustomActivity" >
 9 
10     <ImageView
11         android:layout_width="64dp"
12         android:layout_height="64dp"
13         android:background="@drawable/retouxiang"
14         android:contentDescription="@string/app_name"
15         android:scaleType="fitXY" />
16 
17     <LinearLayout
18         android:layout_width="fill_parent"
19         android:layout_height="64dp"
20         android:orientation="vertical" >
21 
22         <LinearLayout
23             android:layout_width="fill_parent"
24             android:layout_height="32dp"
25             android:orientation="horizontal" >
26 
27             <TextView
28                 android:id="@+id/tv_name"
29                 android:layout_width="0dp"
30                 android:layout_height="32dp"
31                 android:layout_weight="1"
32                 android:text="@string/app_name"
33                 android:textColor="#000000" />
34 
35             <TextView
36                 android:id="@+id/tv_time"
37                 android:layout_width="0dp"
38                 android:layout_height="32dp"
39                 android:layout_weight="1"
40                 android:text="@string/app_name"
41                 android:textColor="#000000" />
42         </LinearLayout>
43 
44         <TextView
45             android:id="@+id/tv_item"
46             android:layout_width="fill_parent"
47             android:layout_height="32dp"
48             android:text="@string/app_name"
49             android:textColor="#000000" />
50     </LinearLayout>
51 
52 </LinearLayout>
talklistadapter.xml

同时,因为只是个Demo,我的头像没有下载的功能,采用了一个空白的头像图片,取消了下载功能,效果如图

 同时,因为聊天记录保存在SQLite中,所以,需要自己实现一个DBhelper的类继承SQLiteOpenHelper,代码如下:

  1 package com.tuisong.db;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashSet;
  5 import java.util.List;
  6 import com.demo.Adapter.MessageEnity;
  7 import com.demo.Adapter.TalkListInfo;
  8 
  9 import android.annotation.SuppressLint;
 10 import android.content.ContentValues;
 11 import android.content.Context;
 12 import android.database.Cursor;
 13 import android.database.sqlite.SQLiteDatabase;
 14 import android.database.sqlite.SQLiteOpenHelper;
 15 
 16 public class DBHelpter extends SQLiteOpenHelper {
 17 
 18     private final static String DATABASE_NAME = "chat_record_db";
 19     private final static String TABLE_NAME = "chat_table";
 20     private final static String FROM_USER = "fromuser";
 21     private final static String TO_USER = "touser";
 22     private final static String TIME = "time";
 23     private final static String CHAT_CONTENT = "content";
 24     private final static String LAYOUT_ID = "layoutid";
 25     @SuppressWarnings("unused")
 26     private final static String CHAT_ID = "id";
 27     private String openid = null;
 28     public DBHelpter help;
 29 
 30     @SuppressLint("NewApi")
 31     public DBHelpter(Context context) {
 32         super(context, DATABASE_NAME, null, 1);
 33         System.out.println("the data has been created");
 34         // TODO Auto-generated constructor stub
 35     }
 36 
 37     @Override
 38     public void onCreate(SQLiteDatabase db) {
 39         // TODO Auto-generated method stub
 40         String sql = "CREATE TABLE if not exists  chat_table ( id  INTEGER PRIMARY KEY  AUTOINCREMENT, fromuser TEXT,   touser   TEXT,   time  TEXT, content TEXT, layoutid TEXT);";
 41 
 42         db.execSQL(sql);
 43         System.out.println(sql);
 44     }
 45     
 46     //更新数据库,因为我没有数据的修改,所以不需要实现此方法
 47     @Override
 48     public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
 49         // TODO Auto-generated method stub
 50         // db.execSQL("drop table if exists" + TABLE_NAME);
 51 
 52         // onCreate(db);
 53     }
 54     //插入数据
 55     public void Insert(MessageEnity message) {
 56         SQLiteDatabase db = this.getWritableDatabase();
 57         ContentValues value = new ContentValues();
 58         value.put(FROM_USER, message.getfromUser());
 59         value.put(TO_USER, message.gettomUser());
 60         value.put(TIME, message.getTime());
 61         value.put(CHAT_CONTENT, message.getItem());
 62         value.put(LAYOUT_ID, message.getLayoutID());
 63 
 64         long ss = db.insert(TABLE_NAME, null, value);
 65         System.out.println("has been insert in db " + ss);
 66     }
 67 
 68     // 消息内容
 69     public List<MessageEnity> findPersonMessage(String openid, String userid) {
 70         List<MessageEnity> messages = new ArrayList<MessageEnity>();
 71         SQLiteDatabase db = this.getReadableDatabase();
 72         System.out.println("dsdfsw" + db.toString());
 73 
 74         String sql = "select * from chat_table where (fromuser='" + openid
 75                 + "' and touser='" + userid + "') or (touser='" + openid
 76                 + "' and fromuser='" + userid + "') order by time ";
 77         Cursor cursor = db.rawQuery(sql, null);
 78         cursor.moveToFirst();
 79         System.out.println("the find message is " + cursor.getCount());
 80         if (cursor.getCount() > 0) {
 81             if (cursor.getCount() > 10) {
 82                 cursor.moveToPosition(cursor.getCount() - 10);
 83                 for (int i = 0; i < 10; i++) {
 84                     MessageEnity message = new MessageEnity();
 85                     message.setfroUser(cursor.getString(cursor
 86                             .getColumnIndex(FROM_USER)));
 87                     message.setItem(cursor.getString(cursor
 88                             .getColumnIndex(CHAT_CONTENT)));
 89                     message.setLayoutID(cursor.getInt(cursor
 90                             .getColumnIndex(LAYOUT_ID)));
 91                     message.setTime(cursor.getString(cursor
 92                             .getColumnIndex(TIME)));
 93                     message.settoUser(cursor.getString(cursor
 94                             .getColumnIndex(TO_USER)));
 95                     messages.add(message);
 96                     cursor.moveToNext();
 97                 }
 98             } else {
 99                 cursor.moveToFirst();
100                 for (int i = 0; i < cursor.getCount(); i++) {
101                     MessageEnity message = new MessageEnity();
102                     message.setfroUser(cursor.getString(cursor
103                             .getColumnIndex(FROM_USER)));
104                     message.setItem(cursor.getString(cursor
105                             .getColumnIndex(CHAT_CONTENT)));
106                     message.setLayoutID(cursor.getInt(cursor
107                             .getColumnIndex(LAYOUT_ID)));
108                     message.setTime(cursor.getString(cursor
109                             .getColumnIndex(TIME)));
110                     message.settoUser(cursor.getString(cursor
111                             .getColumnIndex(TO_USER)));
112                     messages.add(message);
113                     cursor.moveToNext();
114                 }
115             }
116             return messages;
117         } else {
118             return null;
119         }
120 
121     }
122 
123     // 列出消息列表
124     public List<TalkListInfo> findList(String touser) {
125         List<TalkListInfo> infos = new ArrayList<TalkListInfo>();
126         SQLiteDatabase db = this.getReadableDatabase();
127         System.out.println("the ver sion is" + db.getVersion());
128         String sql = "select fromuser, time , content,count(distinct fromuser) from chat_table where touser='"
129                 + touser + "' group by fromuser order by time desc";
130         // Cursor cursor = db.query(TABLE_NAME, new String[] { FROM_USER, TIME,
131         // CHAT_CONTENT }, null, null, null, null, TIME);
132         Cursor cursor = db.rawQuery(sql, null);
133         System.out.println("the ver num is" + cursor.getCount());
134         cursor.moveToFirst();
135         if (cursor.getCount() > 0) {
136             System.out.println("the tag num ");
137             for (int i = 0; i < cursor.getCount(); i++) {
138 
139                 if (cursor.getString(cursor.getColumnIndex(FROM_USER)).equals(
140                         openid) != true) {
141                     TalkListInfo info = new TalkListInfo();
142 
143                     info.setName(cursor.getString(cursor
144                             .getColumnIndex(FROM_USER)));
145 
146                     info.setDate(cursor.getString(cursor.getColumnIndex(TIME)));
147                     info.setItem(cursor.getString(cursor
148                             .getColumnIndex(CHAT_CONTENT)));
149 
150                     infos.add(info);
151                     cursor.moveToNext();
152                 }
153             }
154 
155             System.out.println("tag2");
156             removeDuplicate(infos);
157             return infos;
158         } else {
159             System.out.println("tag3");
160             return infos;
161         }
162 
163     }
164 
165     public static void removeDuplicate(List<TalkListInfo> list) {
166         HashSet<TalkListInfo> h = new HashSet<TalkListInfo>(list);
167         list.clear();
168         list.addAll(h);
169         System.out.println(list);
170     }
171 
172 }
DBHelper.java

 好了到了这里,准备工作已经基本完成了,现在就要编写界面的后台代码了

  1 package com.baidu.push.example;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7 
  8 import com.baidu.android.pushservice.PushConstants;
  9 import com.baidu.android.pushservice.PushManager;
 10 import com.demo.Adapter.ListAdapter;
 11 import com.demo.Adapter.TalkListInfo;
 12 import com.tuisong.R;
 13 import com.tuisong.Save_Read;
 14 import com.tuisong.Until;
 15 import com.tuisong.db.DBHelpter;
 16 
 17 import android.app.Activity;
 18 import android.app.NotificationManager;
 19 import android.content.BroadcastReceiver;
 20 import android.content.Context;
 21 import android.content.Intent;
 22 import android.content.SharedPreferences;
 23 import android.os.Bundle;
 24 import android.view.Menu;
 25 import android.view.MenuItem;
 26 import android.view.View;
 27 import android.widget.AdapterView.OnItemClickListener;
 28 import android.widget.AdapterView;
 29 import android.widget.ListView;
 30 import android.widget.RelativeLayout;
 31 
 32 public class PushDemoActivity extends Activity implements OnItemClickListener {
 33 
 34     private static ListView list;
 35     private static List<TalkListInfo> talk;
 36     private static ListAdapter adapter;
 37     RelativeLayout mainLayout = null;
 38     public static int initialCnt = 0;
 39     public Save_Read save = new Save_Read();
 40     public static Map<String, String> map;
 41     public static DBHelpter help;
 42     public static String userid;
 43     public SharedPreferences sp;
 44     public static NotificationManager manager;
 45 
 46     @Override
 47     public void onCreate(Bundle savedInstanceState) {
 48         super.onCreate(savedInstanceState);
 49 
 50         setContentView(R.layout.main);
 51         @SuppressWarnings("unused")
 52         NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
 53         @SuppressWarnings("unused")
 54         MyReceiver receiver = new MyReceiver();
 55         sp = this.getSharedPreferences("key", 0);
 56         SharedPreferences.Editor edtior = sp.edit();
 57         edtior.putString("SSP", "1");
 58         edtior.commit();
 59 
 60         list = (ListView) findViewById(R.id.list);
 61         help = new DBHelpter(this);
 62         map = new HashMap<String, String>();
 63 
 64         userid = sp.getString("Login", null);
 65         System.out.println("the  login  id is " + userid);
 66 
 67         talk = new ArrayList<TalkListInfo>();
 68 
 69         talk = help.findList(userid);
 70 
 71         if (talk != null) {
 72             for (TalkListInfo t : talk) {
 73 
 74                 map.put("name", t.getName());
 75                 map.put("time", t.getDate());
 76                 map.put("content", t.getItem());
 77             }
 78             adapter = new ListAdapter(this, talk);
 79             list.setAdapter(adapter);
 80         }
 81 
 82         list.setOnItemClickListener(new OnItemClickListener() {
 83 
 84             @Override
 85             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
 86                     long arg3) {
 87                 // TODO Auto-generated method stub
 88                 Intent intent = new Intent(PushDemoActivity.this,
 89                         TalkActivity.class);
 90                 intent.putExtra("name", talk.get(arg2).getName());
 91                 intent.putExtra("userid", userid);
 92                 Until.setString(talk.get(arg2).getName());
 93                 startActivity(intent);
 94 
 95             }
 96         });
 97 
 98         // 以apikey的方式登录,一般放在主Activity的onCreate中
 99         PushManager.startWork(getApplicationContext(),
100                 PushConstants.LOGIN_TYPE_API_KEY,
101                 Utils.getMetaValue(PushDemoActivity.this, "api_key"));
102 
103     }
104 
105     @Override
106     public void onStart() {
107         super.onStart();
108         
109     }
110 
111     @Override
112     public void onResume() {
113         super.onResume();
114         
115         SharedPreferences.Editor edtior = sp.edit();
116         edtior.putString("SSP", "0");
117         edtior.commit();
118 
119     }
120 
121     @Override
122     protected void onNewIntent(Intent intent) {
123         // 如果要统计Push引起的用户使用应用情况,请实现本方法,且加上这一个语句
124         setIntent(intent);
125 
126     }
127 
128     @Override
129     protected void onPause() {
130         // TODO Auto-generated method stub
131         super.onPause();
132         
133         SharedPreferences.Editor edtior = sp.edit();
134         edtior.putString("SSP", "0");
135         edtior.commit();
136     }
137 
138     @Override
139     public void onStop() {
140         super.onStop();
141         PushManager.activityStoped(this);
142         // SharedPreferences.Editor edtior = sp.edit();
143         // edtior.putString("Login", "-1");
144         // edtior.commit();
145         // }
146     }
147 
148     @Override
149     protected void onDestroy() {
150         // TODO Auto-generated method stub
151         super.onDestroy();
152         // SharedPreferences.Editor edtior = sp.edit();
153         // edtior.putString("Login", "-1");
154         // edtior.commit();
155     }
156 
157     @Override
158     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
159         // TODO Auto-generated method stub
160 
161     }
162 
163     public boolean onCreateOptionsMenu(Menu menu) {
164         // 调用父类方法来加入系统菜单
165         // 虽然目前android还没有系统菜单,但是为了兼容到以后的版本,最好加上
166         super.onCreateOptionsMenu(menu);
167 
168         // 添加菜单项(多种方式)
169         // 1.直接指定标题
170         menu.add(1, 0, 1, "退出");
171 
172         // 3.显示指定菜单项的组号、ID、排序号、标题
173 
174         // 如果希望显示菜单,请返回true
175         return true;
176     }
177 
178     @Override
179     public boolean onOptionsItemSelected(MenuItem item) {
180         switch (item.getItemId()) {
181         // 响应每个菜单项(通过菜单项的ID)
182 
183         case 0:
184             change();
185             finish();
186             // do something here
187             break;
188         default:
189             // 对没有处理的事件,交给父类来处理
190             return super.onOptionsItemSelected(item);
191         }
192         // 返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了
193         return true;
194     }
195 
196     
197     //修改当前活动activity的状态
198     public void change() {
199         SharedPreferences.Editor edtior = sp.edit();
200         edtior.putString("Login", "-1");
201         edtior.commit();
202     }
203 }
PushDEmoActivity.java

到这里,对话列表的界面搭建已经完成了,下一篇文章里面介绍聊天界面写法

原文地址:https://www.cnblogs.com/cwr941012/p/3585246.html