下拉刷新加载聊天记录出现的问题以及解决方法

来源:互联网 发布:加工中心宏程序编程 编辑:程序博客网 时间:2024/05/18 21:09

最近在写一个聊天的安卓app,用的开源框架是openfire,这个框架还是非常强大的.但是在处理下拉加载聊天记录的时候,还是出现了一些问题。

1,如果使用ASC排序,刷新之前会显示最久的那几条消息,刷新到最后才显示最新消息。使用DESC排序,那么刷新之前最新的聊天会显示在顶部,越往下刷新越会显示越久的消息。这两种方法始终达不到qq聊天的那种效果,后来查了很多资料,也尝试了很多方法,终于得到了解决。

private int chatPosition = 0;//聊天显示的位置
private int end = 5;//每页显示的聊天个数

/** * 设置聊天的Adapter */private void setChatWindowAdapter() {    String selection = ChatProvider.ChatConstants.JID + " = ?";    String[] selectionArgs = {jid};    String orderBy = "_id asc limit (select count(*) from chat)" + (-end) + "," + "(select count(*) from chat)";    new AsyncQueryHandler(mContentResolver) {        @Override        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {            ListAdapter adapter = new ChatAdapter(ChatActivity.this,                    cursor, PROJECTION_FROM);            lv_chat.setAdapter(adapter);            lv_chat.setSelection(adapter.getCount() - chatPosition);        }    }.startQuery(0, null, ChatProvider.CONTENT_URI, PROJECTION_FROM, selection, selectionArgs, orderBy);}
*关键是这一句orderBy,它用来处理查询的排序条件,使用ASC排序并且默认显示聊天的个数减去每一页的显示个数到最后的那个聊天个数
,每刷新一次就改变显示的个数,这样就可以达到显示的效果,但是这样刷新,刷新之后会跳到最新条聊天。
2.刷新之后跳到之前消息的位置。
 lv_chat.setSelection(adapter.getCount() - chatPosition);
这一句代码listview可以跳转到指定位置,再看一看下拉刷新:
 lv_chat.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {            @Override            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {//下滑//                Toast.makeText(ChatActivity.this, "加载聊天", 0).show();                end += Constant.CHAT_NUM;                chatPosition += Constant.CHAT_NUM;                Log.d("mmd", end + "");                Log.d("hhh", chatPosition + "");                setChatWindowAdapter();                flag++;                new FinishRefresh().execute();            }            class FinishRefresh extends AsyncTask<Void, Void, Void> {                @Override                protected Void doInBackground(Void... params) {                    return null;                }                @Override                protected void onPostExecute(Void result) {                    lv_chat.onRefreshComplete();                }            }            @Override            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {//上滑            }        });    }
这样处理之后就可以实现聊天,下拉刷新加载历史记录了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 快递被菜鸟驿站退回怎么办 电脑登录账户已锁定怎么办 被外管局查到境外汇款买房怎么办 军校生复检被刷怎么办 企业私刻章拿去挂项目怎么办? 中通快递被退回怎么办 网易邮箱提示被修复怎么办 小孩屁股烫红了怎么办 8岁近视400度怎么办 部队体能差的人怎么办 上环5天同房了怎么办 肾结石有3mm了怎么办 4*3mm肾结石好痛怎么办 做完肾结石积水后迟续发烧怎么办 血糖高有肾结石反复发高烧怎么办 肾里面有小结石怎么办 大于2厘米的结石怎么办 双肾结石肾盏扩张怎么办 边防消防警卫部队改革义务兵怎么办 汽车年检尾气复检不合格怎么办 车辆年检尾气不合格复检怎么办? 在瓜子上买车复检有问题怎么办 更换车壳车架号怎么办 吸完甲醛的绿萝怎么办 如果公务员复检不合格有异议怎么办 国考公务员政审没有毕业证怎么办 打针硬块4年不消怎么办 外墙补起来难看不好卖怎么办 杠精现实中应该怎么办 发现记者报道假新闻怎么办 2018消防兵转制到期士官怎么办 小孩睡觉老想着军训怎么办 1岁宝宝太老实了怎么办 上课小孩很调皮不听话怎么办 初中学生上课爱说话调皮怎么办 8个月婴儿疝气怎么办 头部疤痕不长发怎么办呢 有纹身想去当兵怎么办 在部队干活的钱怎么办 新兵5公里超过标准时间怎么办 17个月婴儿裹手怎么办