关闭

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

529人阅读 评论(0) 收藏 举报

最近在写一个聊天的安卓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
查看评论

vs2010/vc6.0中遇到的各种问题收集及解决方法

http://m.blog.csdn.net/blog/EbowTang/37767509 2014-7-14阅读226 评论0 本文目的:整理与收集!解决方法一般来自于网络!有些问题可能不是在vs2010中发生的(有的是在vc6.0)! 参考资源:《精通MF...
  • mengzhengjie
  • mengzhengjie
  • 2015-05-26 15:06
  • 496

iOS聊天下拉刷新聊天记录的实现

1. 想法 最近在开发一个社交类app,要实现类似微信那种下拉刷新聊天记录的功能。 一般有两种实现方式: 1. 直接fetch一个entity的所有数据然后在内存中做filter,就是把所有聊天记录先读出来然后每次加载10条。     缺点:浪费内存 &#...
  • kuihuan2771
  • kuihuan2771
  • 2017-03-15 15:17
  • 187

Android——ForceClose

有时候一些异常可能是不可避免或者是我们还未预测到,这时候程序会强行关闭,即平常所说的forceclose弹窗。 1.出现原因    导致出现Force Close的原因有很多,常见的有比如NullPointExection(空指针)、IndexOutOfBoundsExcept...
  • ls5718
  • ls5718
  • 2016-07-08 09:40
  • 276

实验中可能出现的错误及其解决方法

转载自:http://peilie-coolboy.blog.163.com/blog/static/23952371201241710531592/ 参考文献: [1]马崇霄,吴长奇.基于网络仿真器NS2的Adhoc网络路由协议仿真[J].电子测量技术,2008(5):75-79 ...
  • sinat_34586770
  • sinat_34586770
  • 2016-11-29 15:07
  • 340

学习C语言常见的几个问题及解决方法

所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。   大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐...
  • bentengdehe
  • bentengdehe
  • 2016-04-28 16:52
  • 1515

记录自己学习心得以及工作中遇到问题的总结

第一次来这里写文章,以后会陆续更新其他文章。
  • xieming1601
  • xieming1601
  • 2016-09-10 09:22
  • 199

Android 聊天表情输入、表情翻页带效果、下拉刷新聊天记录

经过一个星期的折腾,终于做完了这个Android 聊天表情输入、表情翻页带效果、下拉刷新聊天记录。这只是一个单独聊天表情的输入,以及聊天的效果实现。因为我没有写服务器,所以没有双方聊天的效果。主要是聊天中表情的选择,发送。表情翻页带有不同的效果。我在主要代码中都写了注释。下面看代码实现。附上本文源码...
  • qq_16064871
  • qq_16064871
  • 2015-08-15 07:46
  • 3362

程序调试中的常见问题及解决方法【2017.9.27更新】

1、CE(Compile Error)编译错误其实很多时候通过返回的错误信息就能找出错误。①缺失符号,如下图 第一句Error表示在“printf”前少了一个分号, 第二句Error表示在“return”前少了一个分号。 通常在错误行的上一行找缺失的分号。比如, int main() ...
  • Byike
  • Byike
  • 2017-08-10 15:11
  • 531

最近工作中遇到的问题以及解决方法总结

项目编译报错 linker command failed with exit code 1 (use -v to see invocation) 对着这个错误,很常见,但引起这个错误的原因却是千奇百怪。这种错误很隐蔽,因为没有详细的错误信息提示。网上也有很多解决方案。但由于原因不一样,所以都无解。...
  • u013749108
  • u013749108
  • 2017-08-25 21:27
  • 401

详解Hibernate中的NoSession问题

1.前言 今天在整合SSH框架的时候,当在表现层调用bean层查找数据的时候,报错,具体如下所示 根据字面上的意思,应该是代理不能被初始化,session已经关闭,这篇博客就来解决一下这个问题。  2.NoSession问题 1.原因分析 当执...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015-08-21 10:05
  • 4671
    个人资料
    • 访问:2042次
    • 积分:99
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条