关于ListView滑动混乱问题

在说listView混乱问题前,先说下listView的工作原理。以前只是知道ListView+convertView+ViewHolder 可以大大的提高效率,但是不明白为什么会是这样。

  ListView根据每一条Item会要求adapter返回一个视图(getView),在listView开始绘制的时候,会先调用getCount()函数得到listView的长度,根据长度绘制每一条item。如果返回0,不绘制,如果返回1,绘制一行。 那么假如有一亿行,那岂不是要绘制一亿行了? 哈哈 。。。当然不是这样的, 实际上android早已缓存了这些视图,android有一个Recycler的构建。工作原理如下:

    



 只有可见的视图是存在内存中的,其余的存在recycler中。

 在显示一个视图(getview()),再显示其它可见的视图时,convertView在getView()中都是null.

 当item1画出屏幕边界,有新的视图从底部显示出的时候,item1一缓存在recycler中,此时converView不为null.此时你只需要通过  convertView.getTag(),获取缓存的视图,然后再为它设置数据就行了,不用再重新获取视图。

  使用ViewHolder只是把要处理的数据封装好,convertView.setTag()是把数据缓存起来供下次使用。


 ok !!! 下面说说我在用listView时遇到滑动时,出现混乱的情况:

  最初的效果是这样的:


滑动后效果 :



就是不改带小图标的结果滑动后带上了。 郁闷了好久。。。 

 于是我在getView()中的convertView.getTag()时,把得到的holder对象中缓存的内容置为null,然后再重新设置自己想要的值,就没问题了。

   @Override
p
ublic View getView(int position, View convertView, ViewGroup parent) {

                    if (convertView == null) {
convertView = inflater.inflate(R.layout.message_item, null);
holder = new ViewHolder();
holder.Title = (TextView) convertView.findViewById(R.id.Title_text);
holder.oritationView = (ImageView) convertView.findViewById(R.id.oritation_img);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag(); // 重置holder
resetViewHolder(holder);
}

                 return convertView;

                }

        private void resetViewHolder(ViewHolder holder){
holder.BookCaragryTitle.setText(null);
holder.oritationView.setImageResource(0);
}


   附加:http://www.xuanyusong.com/archives/1252


你可能感兴趣的:(android)