第一篇博客,写的不好,欢迎拍砖。特别提醒一下显示控件用TextView
在这里我将未读消息的状态、条数、及是否可读封装成了一个bean,NoReadMessageBean 使用时,只需要实例化即可。先讲UI更新如下:
1.在线未读消息数
a.通过启动动来消息监听,一有新消息 通知显示视图中的内部类 broadcast更新UI
详细做法比如:
1>MainActivity中写一个内部BroadCast 在onRecevice中循环遍历 消息列表list 值中 sid 进行判断 更新 Item 显示未读并显示数字
2>在消息监听中那块 发送广播 sendBroadCast();并使用本地数据库判断是否是同一个消息id存入值
3> 显示未读消息完成之后, 在 消息列表视图中 itemt点击事件监听中 加入未读显示若可见 将之隐藏 并删除本地已读消息记录 节约资源
2.离线未读消息数
通过离线获取新消息的 数量 通过MainActivity中内部类broadcast更新UI 同上。
我已经将上面的做成jar包。下面讲,怎么调用jar包。
1.未读消息的监听记录
NoSys sys = NoSys.getInstance(this);
Intent in = new Intent(this,"no_read_message_broadcast");
NoReadMessageBean bean = new NoReadMessageBean(sid,num,"false");
sys.addListenter(bean);
sendBroadcast(in);
2.未读消息的显示条目
List<NoReadMessageBean> noReadMessageBeans = noSys.select(new NoReadMsgDBManager.RowMapper<NoReadMessageBean>() {
@Override
public NoReadMessageBean mapRow(Cursor cursor, int i) {
NoReadMessageBean bean = new NoReadMessageBean();
bean.setSid(cursor.getString(cursor.getColumnIndex("sid")));
bean.setNum(cursor.getString(cursor.getColumnIndex("num")));
bean.setIsRead(cursor.getString(cursor.getColumnIndex("isread")));
return bean;
}
});
noSys.onyesFreshNewMessage(noReadMessageBeans,mTopListDates, new NoSys.Property() {
@Override
public String getSid(Object o) {
return ((MainTopListBean) o).getSERVICEID();
}
@Override
public String getIsRead(Object o) {
return null;
}
@Override
public String getNum(Object o) {
return null;
}
},mTopListView,R.id.id_msg_hint);
3.点击取消消息显示条目
mTopListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view, final int position, long id) {
//隐藏未读消息显示
noSys.onItemDeleteFormDbSqlte(mTopListDates.get(position).getSERVICEID(), mTopListDates, new NoSys.Property() {
@Override
public String getSid(Object o) {
return ((MainTopListBean)o).getSERVICEID();
}
@Override
public String getIsRead(Object o) {
return null;
}
@Override
public String getNum(Object o) {
return null;
}
},mTopListView,R.id.id_msg_hint);
源码分享:-----------------------------------------------------
NoSys.java
/** * Created by jxe on 16/3/16. */ public class NoSys { private static NoReadMsgDBManager noReadMsgDBManager; private static NoSys noSys; private static Context mContext; private NoSys(){} public static NoSys getInstance(Context context){ mContext = context; try{ noReadMsgDBManager = NoReadMsgDBManager.getInstance(context); noReadMsgDBManager.createDb(); }catch (Exception e){ Log.e("NoSys", "创建数据库出现问题"); } if (noSys != null) { return noSys; } return new NoSys(); } /** * 添加来消息的监听 * @param list 需要更新的消息列表 * @param bean 未读消息对象 * @param property 获取对象属性 * @param <T> */ public<T> void addListenter(List<T> list, NoReadMessageBean bean, NoReadMsgDBManager.Property property){ if (list != null) { for (int i = 0; i < list.size(); i++) { T tt = list.get(i); if (property.getSid(tt).equals(property.getSid(bean.getSid()))) { int count = Integer.parseInt(property.getNum(tt)); NoReadMessageBean bean1 = new NoReadMessageBean(property.getSid(bean), (count + 1) + "", "false"); noReadMsgDBManager.updateNum(bean1, property); return; } } } noReadMsgDBManager.insert(bean, property); return; } /** * 是否刷新view层的消息显示 * @param noReadBeans 本地查询的未读消息列表 * @param list 需要刷新view视图中消息列表 * @param property 获取消息属性 * @param view 需刷新的消息视图 * @param id 消息视图中的id * @param <T> */ public<T> void onyesFreshNewMessage(List<NoReadMessageBean> noReadBeans,List<T> list,Property property, ListView view,int id){ if (noReadBeans != null){ for (int i = 0; i < noReadBeans.size(); i ++){ if ("false".equals(property.getIsRead(noReadBeans.get(i).getIsRead()))){ String sid = property.getSid(list.get(i)); for (int j = 0; j < list.size(); j ++){ if (sid.equals(property.getSid(list.get(i)))){ TextView newMsgText = (TextView) view.getChildAt(j).findViewById(id); newMsgText.setVisibility(View.VISIBLE); newMsgText.setText(noReadBeans.get(i).getNum()); break; } } } } } } /** * 对象属性 * @param <T> */ public interface Property<T> { /** * * @param t * @return */ public String getSid(T t); /** * * @param t * @return */ public String getIsRead(T t); /** * * @param t * @return */ public String getNum(T t); } /** *查询本地未读消息记录 * @param rowMapper * @param <T> * @return */ public<T> List<T> select(NoReadMsgDBManager.RowMapper<T> rowMapper){ List<T> list = noReadMsgDBManager.select(rowMapper); return list; } /** * 点击未读消息item 取消未读状态 * @param sid 需取消的item 每条消息的唯一标识 * @param list 视图中的消息列表 * @param property 对象属性 * @param view 需刷新的视图 * @param id 需刷新的视图id * @param <T> */ public<T> void onItemDeleteFormDbSqlte(String sid, List<T> list, Property property,ListView view, int id){ for (int j = 0; j < list.size(); j ++){ if (sid.equals(property.getSid(list.get(j)))){ TextView newMsgText = (TextView) view.getChildAt(j).findViewById(id); newMsgText.setVisibility(View.INVISIBLE); break; } } noReadMsgDBManager.delete(sid); } }
NoReadMessageBean.java
/** * Created by jxe on 16/3/17. */ public class NoReadMessageBean { private String sid; private String num; private String isRead; public NoReadMessageBean() {} public NoReadMessageBean(String sid, String num, String isRead) { this.sid = sid; this.num = num; this.isRead = isRead; } public String getSid() { return sid; } public String getNum() { return num; } public String getIsRead() { return isRead; } public void setSid(String sid) { this.sid = sid; } public void setNum(String num) { this.num = num; } public void setIsRead(String isRead) { this.isRead = isRead; } }
NoReadMsgDBManager.java
/**
* Created by jxe on 16/3/16.
*/
public class NoReadMsgDBManager {
private SQLiteDatabase db;
static Context mContext;
static NoReadMsgDBManager instance;
private NoReadMsgDBManager(){}
public static NoReadMsgDBManager getInstance(Context context){
mContext = context;
if (instance != null)
{
return instance;
}
return new NoReadMsgDBManager();
}
/**
* 返回db
* @return
*/
public SQLiteDatabase getDb(Context context,String name,int mode, SQLiteDatabase.CursorFactory factory){
if (db!= null){
return db;
}else{
return context.openOrCreateDatabase(name,mode, factory);
}
}
/**
* 建立本地未读消息数据库
* @param
*/
public void createDb(){
try{
String sql = "create table test(sid varchar(20) ,num varchar(20) ,isread varchar(20) )";
db = mContext.openOrCreateDatabase("nodata", Context.MODE_PRIVATE,null);
db.execSQL(sql);
Log.e("main", "创建数据库成功");
}catch (Exception e){
Log.e("main", "创建数据库失败");
}
}
/**
* 自定义 建数据库
* @param sql 执行sql
* @param bindArgs
*/
public void diyCreateDb(String sql, String[] bindArgs){
try{
db.execSQL(sql,bindArgs);
Log.e("main", "创建数据库成功");
}catch (Exception e){
Log.e("main", "创建数据库失败");
}
}
/**
* 插入未读消息数据
* @param t
* @param property
* @param <T>
*/
public<T> void insert(T t,Property property){
try{
String sql = "insert into test(sid,num,isread) values('"+property.getSid(t)+"','"+property.getNum(t)+"','"+property.getIsRead(t)+"')";
db.execSQL(sql);
Log.e("main", "插入数据成功");
}catch (Exception e){
Log.e("main", "插入数据失败");
}
}
/**
* 定义插入数据
* @param table 表
* @param nullColumnHack
* @param values
*/
public void diyInsert(String table,String nullColumnHack, ContentValues values){
try{
db.insert(table, nullColumnHack, values);
Log.e("main", "插入数据成功");
}catch (Exception e){
Log.e("main", "插入数据失败");
}
}
/**
* 根据sid删除未读消息记录
* @param sid 需删除的sid
*/
public void delete(String sid){
try{
String sql = "delete from test where sid="+sid+"";
db.execSQL(sql);
Log.e("main", "删除数据成功");
}catch (Exception e){
Log.e("main", "删除数据失败");
}
}
/**
* 更新消息记录
* @param t
* @param property
* @param <T>
*/
public<T> void update(T t,Property property){
try{
String sql = "update test set isread="+property.getIsRead(t)+" where sid="+property.getSid(t)+"";
db.execSQL(sql);
Log.e("mainUpdata", "更新数据成功");
}catch (Exception e){
Log.e("mainUpdata", "更新数据失败");
}
}
/**
* 更新同一个人对话 未读消息记录
* @param t 需更新的记录
* @param property 对象属性
* @param <T>
*/
public<T> void updateNum(T t,Property property){
try{
String sql = "update test set num="+property.getNum(t)+" where sid="+property.getSid(t)+"";
db.execSQL(sql);
Log.e("mainUpdata", "更新数据成功");
}catch (Exception e){
Log.e("mainUpdata", "更新数据失败");
}
}
/**
*查询本地未读消息记录
* @param rowMapper
* @param <T>
* @return
*/
public<T> List<T> select(RowMapper<T> rowMapper){
List<T> list = null;
String sql = "select * from test";
try{
Cursor cursor = db.rawQuery(sql, null);
while(cursor.moveToNext()){
list.add(rowMapper.mapRow(cursor,cursor.getPosition()));
}
cursor.close();
}catch (Exception e){
Log.e("mainSelect", "查询数据失败");
return null;
}
Log.e("mainSelect", "查询数据成功");
return list;
}
public interface RowMapper<T> {
/**
* @param cursor 游标
* @param index 下标索引
* @return
*/
public T mapRow(Cursor cursor, int index);
}
public interface Property<T> {
/**
*
* @param t
* @return
*/
public String getSid(T t);
/**
*
* @param t
* @return
*/
public String getIsRead(T t);
/**
*
* @param t
* @return
*/
public String getNum(T t);
}
}