关于对话列表的listview的优化
来源:互联网 发布:蒙自电视台网络直播 编辑:程序博客网 时间:2024/05/17 00:09
想必大家都知道viewholder设置tag优化listview的方法,以下摘抄:
private String[] mArrData;
private TextView mTV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTV = (TextView) findViewById(R.id.tvShow);
mArrData = new String[1000];
for (int i = 0; i < 1000; i++) {
mArrData[i] = "Google IO Adapter" + i;
}
mAdapter = new TestAdapter(this, mArrData);
((ListView) findViewById(android.R.id.list)).setAdapter(mAdapter);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 开始计时
long startTime = System.nanoTime();
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text,
null);
holder = new ViewHolder();
holder.icon1 = (ImageView) convertView.findViewById(R.id.icon1);
holder.text1 = (TextView) convertView.findViewById(R.id.text1);
holder.icon2 = (ImageView) convertView.findViewById(R.id.icon2);
holder.text2 = (TextView) convertView.findViewById(R.id.text2);
convertView.setTag(holder);
}
else{
holder = (ViewHolder)convertView.getTag();
}
holder.icon1.setImageResource(R.drawable.icon);
holder.text1.setText(mData[position]);
holder.icon2 .setImageResource(R.drawable.icon);
holder.text2.setText(mData[position]);
// 停止计时
long endTime = System.nanoTime();
// 计算耗时
long val = (endTime - startTime) / 1000L;
Log.e("Test", "Position:" + position + ":" + val);
if (count < 100) {
if (val < 1000L) {
sum += val;
count++;
}
} else
mTV.setText(String.valueOf(sum / 100L));// 显示统计结果
return convertView;
}
}
static class ViewHolder {
TextView text1;
ImageView icon1;
TextView text2;
ImageView icon2;
}
但是这种优化在对话列表时候出现了问题,因为对话列表需要针对收信息还是发信息做两种布局:
boolean isComMsg //收信息
if (isComMsg) {
convertView = mInflater.inflate(R.layout.chat_item_left, null);
} else {
convertView = mInflater.inflate(R.layout.chat_item_right, null);
}
在用上述方式的时候发现,很多应该是R.layout.chat_item_left布局的用成了R.layout.chat_item_right,相反也有,有错有对很乱,思考了很久都找不到结局方法,原因大约是convertView不为空的时候就没有重新inflate。
后来我看到了很奇怪的优化方式:
ViewHolder holder;
if (convertView == null || convertView.getTag(R.drawable.ic_launcher + position) == null) {
convertView.setTag(R.drawable.ic_launcher + position);
} else {
holder = (ViewHolder) convertView.getTag(R.drawable.ic_launcher + position);
}
重点是position,不要被R.drawable.ic_launcher 迷惑了,这只是个int。
按照这个方式其实原本的优化方式基本没用了吧?每一个positon都有一个convertView??????
后来按照这个奇怪的优化方式我想出了解决左右混乱现象的方法:
定义一个tag int tagIsComMsg = 0;
if (convertView == null || convertView.getTag(tagIsComMsg) == null) {
holder = new ViewHolder();
if (isComMsg) {
tagIsComMsg = 1;
convertView = mInflater.inflate(R.layout.chat_item_left, null);
} else {
tagIsComMsg = 0;
convertView = mInflater.inflate(R.layout.chat_item_right, null);
}
convertView.setTag(tagIsComMsg);
} else {
holder = (ViewHolder) convertView.getTag();
}
原理就是针对接收还是发送的信息做两种tag,经过测试发现左右混乱的现象消失了,而且listview确实不卡了。这个是对话列表优化的第一步,第二步是图片缓存等等。
- 关于对话列表的listview的优化
- 关于listview的优化
- 关于ListView的优化!
- 关于listView的优化
- 关于ListView的优化总结
- 关于Rose的对话
- 关于工作的对话
- 关于ListView的删除刷新列表
- 关于高仿微信对话列表滑动删除效果代码优化
- Android关于ListView的优化问题
- 关于ListView加载优化的一些领悟
- 关于Android ListView的优化问题
- android优化--滑动ListView列表时背景变黑的解决方法
- Android ListView复杂列表优化实践 - DarcyYe的个人空间
- ListView列表控件的介绍和性能优化
- 关于openssl应用的对话
- 关于JAVA操作系统的对话
- 关于.net的精彩对话
- 分析代码的利器 - ctags
- php中CutyCapt实现网页截图保存代码
- iOS -- OpenSSL进行RSA加密解密概念
- BMP图像的格式
- 反转字符
- 关于对话列表的listview的优化
- 题目5 Binary String Matching
- 迭代器模式---学习笔记
- 将Java中的数组转换成JS中的数组
- mybatis热部署加载*Mapper.xml文件
- photoshop
- Java Date 和 Calendar
- uva 10061(数学)
- LCD液晶屏工作原理