java.lang.Class Cast Exception: android.widget.HeaderViewListAdapter

转载 2015年07月08日 16:08:30

ListView上面增加一个HeaderView,运行的时候报了这个错误。

下面是Demo中的一个自定义View的代码:

public class SideBar extends View {
 private char[] mL;
 private SectionIndexer mSectionIndexter = null;
 private ListView mList;
 private TextView mDialogText;
 private final int mM_nItemHeight = 15;

 public SideBar(Context context) {
  super(context);
  init();
 }

 public SideBar(Context context, AttributeSet attrs) {
  super(context, attrs);
  init();
 }

 public SideBar(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  init();
 }

 private void init() {
  mL = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
    'W', 'X', 'Y', 'Z' };
 }

 public void setListView(ListView listView) {
  mList = listView;
  HeaderViewListAdapter ha = (HeaderViewListAdapter) listView.getAdapter();
  mSectionIndexter = (SectionIndexer) ha.getWrappedAdapter();
//  mSectionIndexter = (SectionIndexer) listView.getAdapter();
 }

 public void setTextView(TextView mDialogText) {
  this.mDialogText = mDialogText;
 }

 public boolean onTouchEvent(MotionEvent event) {
  super.onTouchEvent(event);
  int i = (int) event.getY();
  int idx = i / mM_nItemHeight;
  if (idx >= mL.length) {
   idx = mL.length - 1;
  } else if (idx < 0) {
   idx = 0;
  }
  if (event.getAction() == MotionEvent.ACTION_DOWN
    || event.getAction() == MotionEvent.ACTION_MOVE) {
   mDialogText.setVisibility(View.VISIBLE);
   mDialogText.setText("" + mL[idx]);
   if (mSectionIndexter == null) {
    mSectionIndexter = (SectionIndexer) mList.getAdapter();
   }
   int position = mSectionIndexter.getPositionForSection(mL[idx]);
   if (position == -1) {
    return true;
   }
   mList.setSelection(position);
  } else {
   mDialogText.setVisibility(View.INVISIBLE);
  }
  return true;
 }

 protected void onDraw(Canvas canvas) {
  Paint paint = new Paint();
  paint.setColor(0xff595c61);
  paint.setTextSize(12);
  paint.setTextAlign(Paint.Align.CENTER);
  float widthCenter = getMeasuredWidth() / 2;
  for (int i = 0; i < mL.length; i++) {
   canvas.drawText(String.valueOf(mL[i]), widthCenter, mM_nItemHeight
     + (i * mM_nItemHeight), paint);
  }
  super.onDraw(canvas);
 }
}

解决方法:

ListView增加HeaderView之后,将原来的Adapter包装成HeaderViewListAdapter,看看HeaderViewListAdapter的文档说明:

ListAdapter used when a ListView has header views. This ListAdapter wraps another one and also keeps track of the header views and their associated data objects.

This is intended as a base class; you will probably not need to use this class directly in your own code.

HeaderViewListAdapter有个方法getWrappedAdapter,该方法能返回被包装的HeaderViewListAdapter的ListAdapter。

到了这里就明白为什么会报ClassCastException异常了。因为ListView的getAdapter方法返回的是HeaderViewListAdapter的实例,而将其转换成BaseAdapter的子类的实例,肯定是不对的。

下面是我给显示好友的ListView设置HeaderView和Adapter的代码:

// 这里要注意,给ListView增加HeaderView和Adapter顺序,不然会报错。

LinearLayout headerView = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.weibo_friends_listheader, null);
 mFriendsContact.addHeaderView(headerView);

 mFriendsContact.setAdapter(new FriendListViewAdapter(this, mNicks));  
 mIndexBar.setListView(mFriendsContact);

 注意上面SideBar这个类中红色标记方法内的代码:

 public void setListView(ListView listView) {
  mList = listView;

  //更改后的,我在获得ListView的Adapter之前进行了一下转换
  HeaderViewListAdapter ha = (HeaderViewListAdapter) listView.getAdapter();
  mSectionIndexter = (SectionIndexer) ha.getWrappedAdapter();

//更改前的
//  mSectionIndexter = (SectionIndexer) listView.getAdapter();
 }

可以参考这篇文章:http://hi.baidu.com/su350380433/item/3e70f16022b0471b7ddeccd8

版权声明:本文为博主原创文章,未经博主允许不得转载

FindBugs规则整理

FindBugs是基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug,主要检查bytecode中的bug patterns,如NullPoint空指针检查...
  • kingkongII
  • kingkongII
  • 2013年09月12日 22:34
  • 7533

Spring开发常见异常及原因列表

异常:Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: pu...
  • lxb_champagne
  • lxb_champagne
  • 2013年08月22日 10:25
  • 4714

javafx的创建过程中产生的问题

javafx写主程序的时候提示Exception in Application start method java.lang.reflect.InvocationTargetException  ...
  • u010211479
  • u010211479
  • 2016年05月12日 11:46
  • 1760

黑马程序员--反射知识点总结

——- android培训、java培训、期待与您交流! ———- 认识Class类之前学习的java处理的基本机制,是先把java源文件通过java编译器编译后生成字节码文件...
  • wxgxxzj
  • wxgxxzj
  • 2015年06月04日 20:30
  • 202

spring-websocket框架搭建遇到的问题解决方案汇总

问题1 org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server 严...
  • UP19910522
  • UP19910522
  • 2014年08月06日 10:50
  • 34736

java基础之反射

Contents java基础巩固笔记(1)-反射反射 反射基本使用数组的反射配置文件加载内省(Instropector) & JavaBean 反射 反射:将类的...
  • xiangzhihong8
  • xiangzhihong8
  • 2016年03月11日 10:37
  • 1068

Java类加载与锁

本文写作的灵感来自Pierre-Hugues Charbonneau的为什么加载不存在的类会影响系统性能一文。这让我想起了之前的一次调试经历,当时也遇到了类似的问题,只不过表现略有不同。   出问题...
  • wanglha
  • wanglha
  • 2015年04月01日 09:29
  • 360

深入研究java.lang.Class类

Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类...
  • hzw2312
  • hzw2312
  • 2013年03月05日 11:36
  • 1502

tensorflow gpu版本读取cifar10-binary出现类似卡死状态

今天使用自己写的卷积去调用tensorflow cifar10模组中的cifar10_input.py去读取cifar10数据集,但是每次运行到distorted_input函数就一直停在那,并且cp...
  • u014524930
  • u014524930
  • 2017年12月23日 01:32
  • 71

SQL中的cast()函数

语法: CAST (expression AS data_type) 参数说明: expression:任何有效的SQServer表达式。 AS:用于分隔两个参数,在AS之前的...
  • chen_yanfeng
  • chen_yanfeng
  • 2015年12月03日 15:47
  • 1002
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java.lang.Class Cast Exception: android.widget.HeaderViewListAdapter
举报原因:
原因补充:

(最多只允许输入30个字)