ListView使用itemType遇到的问题

一. ListView 添加多类型布局

  1. 重写getViewTypeCount(),返回拥有的布局类型个数。
  2. 重写getItemViewType(int position):根据position返回类型

    注意:此处返回的类型可定义为常量,且从0开始,否则可能出现数组越界异常
    java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
    at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:6705)

3、重写getView方法,根据position调用getItemViewType(int position)方法来判断不同的item布局类型,之前使用传统的viewHolder缓存机制即可。

注意:在ListView的缓存机制中,会根据布局类型的个数,创建一个ArrayList[] mScrapViews来缓存convertView ,每一个ArrayList是一类布局的复用converView,故每个item类型传入的复用convertView肯定就是对应的类型布局view。

二.ListView 中的getViewTypeCount()使用动态设置遇到的问题

为了在初始化时给listView 设置适配器,重写了一个没有数据源的适配器构造器,
然后写了一个setData()方法设置数据,然后在此方法中计算ViewTypeCount,导致在设置数据后,复用过程中出现了 复用的convertView 和 类型不匹配的情况,导致viewHolder为空,出现空指针异常。

这种情况就需要每次创建适配器给ListView,不能再动态数据源。

你可能感兴趣的:(android基础,源码分析)