假设我现在有两种不同的Item,一个item上有图片,一个Item上有按钮。我现在把这两种item都放在listview中,通过getItemViewType方法来实现,代码如下:
public int getItemViewType(int position)
{
  int r=getItem(position).isFriend?TYPE_IMAGE:TYPE_BUTTON;
  return r;
}public View getView(int position, final View convertView, ViewGroup parent)
{
  View view=null;
  if(convertView == null) 
  {
    if(getItemViewType(position)==TYPE_IMAGE)
    {
      view=mInflater.inflate(R.layout.image, parent, false);
    }
    else
    {
      view=mInflater.inflate(R.layout.button, parent, false);
    }
  }
  else
    view=convertView;
  return view; 
}
现在的问题是这样的,假设数据中前10项是Image,后面的全都是Button。那么当发生滚动时,应该滚出来的是Button,但是有时会滚动出Image,请问有什么方法避免这种问题,我现在的做法是每次调用getView都重新创建convertView,但这样子是不是太耗性能了?

解决方案 »

  1.   

    问题出在
    else
      view=convertView;这是我在回答别人一个list里面的check框的问题的片段:
    在屏幕滚动的时候,它会把前面已经创建的View(现在由于滚屏了,看不见了),重新用在后来的项里面,简单来说。当ListView滚动到最顶部的时候,第一个View就是listAdapter里面的第一项,当向下滚动一行时,原来的第一个View会用来显示listAdapter里面的第二项。为了解决后面这个优化带来的问题,你可能必须在每次滚屏的时候,都要去查找所有View,以便打上勾或者去掉勾(去掉勾是因为,有可能同一个View,以前是打勾的,现在重用到另一项,而这一项没有勾,所以必须去掉)。你现在由于已经自己实现了getView,所以直接在getView里面做就行(不用像我上面说的那样,在滚屏时判断,上面是推荐原贴作者自己实现getView,不过问题都是由于优化引出的,优化是系统自己做的,控制不了)。
      

  2.   

    部件不都是最后加上去的吗,和getView没有关系,相对应的行返回不同的view即可
      

  3.   

    你好,楼主,问题解决了吗,我也遇到同样问题,希望得到你的帮忙,我的号是  [email protected]
    麻烦你给我一个相关的demo吧,谢谢了。