本文讲的是未读消息条目显示及本地缓存

第一篇博客,写的不好,欢迎拍砖。特别提醒一下显示控件用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);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值