[Android]用ListView做IM聊天时遇到的问题

很羞愧的是,第一个有关程序的随笔就是一处我暂时无法解决并解释的问题, 先记录下来吧, 等以后弄明白了再补充.

最近在做一个android端的IMAPP, 通讯协议采用的XMPP(因为时间比较紧,并属于内部软件,一切从简了), 服务器用的openfire二次开发, android端自然就是asmack了, 网上有很多例子, 封装的已经很到位了.

在做的过程中, 聊天页肯定是采用ListView了.大约得效果如下图:

  不好意思哈,这个效果图是仿的微信...

  大家都用过微信,知道进入聊天界面时,ListView会自动滚动到最新的一条消息, 也就是最后一行.

  看起来这个效果应该很好做,因为ListView有很多方法可以做到这一点.

  但是...但是...问题来了...

  我的做法是

  1.首先在XML里设置了

android:transcriptMode="alwaysScroll"

网上对这个属性的解释是: 可以在列表改变的时候自动将最后一行滑到可视范围.

注意是...改变的时候...也就是说如果新加一条数据,或者ListView的大小发现变化的时候(就是点击EditView时弹出键盘时),会出现自动滚屏的效果.

这里不包括初次加载数据时,至少我这里的真机是没有任何效果,对了我以上以下所说的现象都是我个人测试现象,没有任何通用性权威性可言.

继续查百度, 有人说要加上一句

android:stackFromBottom="true"

我加上了, 确实是有效果, 但还是有个问题: 如果ListView的数据量是可以超出一个屏幕的时候, 效果满足, 如果数据量不足一个屏幕就是会出现下面的效果:

  那我就考虑通过ListView里数据量来动态设置这个属性

if(...){
    lv.setStackFromBottom(true);      //默认是false
}

满以为这样就可以了.. 是的, 如果是纯文本确实没问题, 但如果有需要异步加载的图片时...问题又来了...我用的开源组件ImageLoader

String mapUrl = Scheme.FILE.wrap(data.getPath());
ImageLoader.getInstance().displayImage(mapUrl, content_img, options);

一旦有图片需要加载,ListView又会显示第一条数据了...怎么办?百度...查到ListView的setSelection(position)方法.我的想法是在设置完适配器后在手动选择最后一行:

listview.setAdapter(adapter);
listview.setSelection(adapter.getCount()-1);

然后现象很是奇怪, activity第一次onCreate时, 滚动条是在不在最上也不是最下面,在中间的某个位置, 然后返回键, 再次进入, 就是最下面了...

第一次进入明显滚动条在中间位置,上面第一条显示不完全返回键后,再次进入一切正常了

我觉得原因是第一次因为image异步加载时操作了UI, 导致setSelected()失效, 第二次正常可能是imagLoader有缓存,并没有加载图片...

我实在没有办法了..那我等图片加载完再setSelected()吧.

ImageLoader.getInstance().displayImage(imageUrl, content_img, options,
    new SimpleImageLoadingListener() {
        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
          super.onLoadingComplete(imageUri, view, loadedImage);
          ChatListAdapter.this.listView.setSelection(getCount()-1);
    }
});

这总行了吧...还是有问题...这样的写法在列表滑动过程中如果加载图片了, 会有个跳卡的效果.所以最后还要判断并设置在第一次进入界面时加载图片成功执行上面代码...然后就不执行了...

告诉我, 为什么会做的这么复杂!!! 我把流程贴出来就不怕你们笑话了...求教!!!

时间: 2024-08-25 07:36:34

[Android]用ListView做IM聊天时遇到的问题的相关文章

android 修改listview中adapter数据时抛出异常java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification问题

近日在做项目时遇到非必现crush,具体异常信息为: // Short Msg: java.lang.IllegalStateException // Long Msg: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not mo

【Android】解决Android的ListView控件滚动时背景变黑

[转载]解决Android的ListView控件滚动时背景变黑 如果大家在非黑色背景下使用ListView控件时,Android默认可能在滚动ListView时这个列表控件的背景突然变成黑色.这样可能导致程序的黑色的背景和主程序的主题既不协调.解决的方法Google在设计Android时也考虑了,在Layout的ListView中加入android:cacheColorHint="#00000000" 的属性即可. 如: <?xml version="1.0"

Android中用ListView创建应用商店时的几个优化

package com.example.ex01_1; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Arra

android的ListView做表格添加圆角边框

边框,圆角,都可以实现的 在drawable目录下添加view_yuan_morelist.xml,设置控件的边框代码.如下: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <sol

Android中ListView选中时的黄色底色

Android的ListView中默认选中时底色为黄色,如何去掉呢 其中会用到一个属性: android:listSelector="#00000000" 这样就行了 Android中ListView选中时的黄色底色

Android中ListView滑动时数据混乱

相信做过Android应用开发的或多或少的都遇到过这样的问题,要不就是在ListView滑动时出现数据混乱,或者是GridView滑动时出现数据混乱.先来看看一位网友写的文章,个人感觉这篇文章挺不错的: Android ListView滑动过程中图片显示重复错位闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行i

android如果用ListView做一个表格形式

效果图: 这样来写: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); ListView list = (ListView)findViewById(R.id.lvLinks); SquareItemAdapter adapter = new SquareItemAdapter(this)

Android 解决ListView在使用多个布局的同时使用convertView进行缓存时导致ListView下面有空白的问题

在使用ListView时,在Adapter里面使用convertView会提高ListView的性能,提升100%?但今天发现在listView同时加载不同的View的同时会导致ListView最底下有一块空白,可能是恰巧吧,导致这样的原因可能是加载了几个不同的View,而他们的高度不同,数量也不同,系统无法准确计算ListView的总高度. 在 BaseAdapter里面提供了两个回调函数来指定有多少种布局,指定position对应的是哪一个布局. @Override public int g

universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使用UIL遇到了这个问题,相信这个问题许多使用UIL的人都碰到过 现在把解决方法贴出来给有同样问题的朋友做参考 先看下UIL的工作流程 在已经允许内存,存储卡缓存的前提下,当一个图片被请求display时,首先要判断图片是否缓存在内存中,如果false则尝试从存储卡读取,如果依然不存在最后才从网络地址