今天在使用ListView 自定义Adapter的时候出了一个ArrayIndexOutOfBoundsException错误,错误信息如下:

java.lang.ArrayIndexOutOfBoundsException: length=2; index=2    at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:5996)    at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4554)    at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:3874)    at android.os.Handler.handleCallback(Handler.java:605)    at android.os.Handler.dispatchMessage(Handler.java:92)

这里先贴出有问题的代码:

private class HistoryAdapter extends BaseAdapter {public LayoutInflater inflater;static final int CLEAR_ITEM = 1;static final int COMMON_ITEM = 2;public HistoryAdapter(Context ctx) {this.inflater = LayoutInflater.from(ctx);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn historyKey.length + 1;}@Overridepublic int getViewTypeCount() {// TODO Auto-generated method stubreturn 2;}@Overridepublic int getItemViewType(int position) {if(position!= historyKey.length){return COMMON_ITEM;}else{return CLEAR_ITEM;}}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubViewHolderH holder;if (convertView == null) {holder = new ViewHolderH();if(getItemViewType(position)==COMMON_ITEM){convertView = inflater.inflate(R.layout.list_search_history_item, null);holder.tv_key = (TextView) convertView.findViewById(R.id.tv_key);}else{convertView = inflater.inflate(R.layout.list_search_history_footer, null);}convertView.setTag(holder);} else {holder= (ViewHolderH) convertView.getTag();}LogUtil.i(TAG, "position="+position);if(getItemViewType(position)==COMMON_ITEM){holder.tv_key.setText(historyKey[position]);}else{LogUtil.i(TAG, "position="+position +" last");}return convertView;}}static class ViewHolderH {TextView tv_key;}


反复检查了半天代码,没觉得哪里写的问题,最后在stackoverflow上找到了答案。

大概解释如下:

HistoryAdapter 的 getViewTypeCount() 方法返回值为2,表示ListView中有两种不同的视图, getItemViewType() 的返回值分别为1或2, 取决于item在ListView中的位置。Adapter 的 getItemViewType() 的返回值应该是从下表0开始的, 所以应该返回0或者1。


解决办法

static final int CLEAR_ITEM = 0;static final int COMMON_ITEM = 1;
@Overridepublic int getViewTypeCount() {// TODO Auto-generated method stubreturn 2;}@Overridepublic int getItemViewType(int position) {if(position!= historyKey.length){return COMMON_ITEM;}else{return CLEAR_ITEM;}}


getItemViewType() 的返回值改为 0或者1,运行不报错了,问题解决啦!


最后总结一点是:Adapter的getViewTypeCount 方法和getItemViewType方法返回值之间存在一定的关系。如果getViewTypeCount 返回值为 3,那么getItemViewType方法的返回值应该是 0、1、2,不能超过2,否则会出现ArrayIndexOutOfBoundsException异常。






更多相关文章

  1. Android通过Uri获取文件的路径的方法
  2. android使用全局变量的方法
  3. android 根据SD卡中图片路径读取并显示SD中的图片——源代码
  4. android代码混淆及打包相关
  5. android 中生成XML文件的代码
  6. [置顶] [Android自定义控件]Android中如何用代码写出优美的Button
  7. 2.4.8 滚动视图
  8. Android里把View切换圆角的方法
  9. recovery代码流程

随机推荐

  1. Android设备信息管理工具类
  2. android 如何接收和发送intent
  3. Android Bitmap精确缩放到指定大小
  4. Android使用View类动画
  5. android 设置搜狗输入法为默认输入法
  6. android wifi状态更新
  7. 关于android中的宏定义查找
  8. Android增加自定义监听事件
  9. Android studio 点击按钮 改变viewtext
  10. android > WiFi > 新建连接