关于对话列表的listview的优化

来源:互联网 发布:蒙自电视台网络直播 编辑:程序博客网 时间:2024/05/17 00:09

想必大家都知道viewholder设置tag优化listview的方法,以下摘抄:

 Activity
     private TestAdapter mAdapter;

    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);
    }
         Adapter
      private int count = 0;
    private long sum = 0L;

        @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;
    }

       在Adapter的代码中,在getView方法里首先判断convertView是否为空,若为空则加载相应布局,若不为空则
直接使用该布局,这能够很有效的使用Android为listview提供的缓存机制:只加载一屏的布局,之后滑动出来的item使用的是之前已经加载的布局的缓存;

但是这种优化在对话列表时候出现了问题,因为对话列表需要针对收信息还是发信息做两种布局:

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确实不卡了。这个是对话列表优化的第一步,第二步是图片缓存等等。


0 0
原创粉丝点击