android应用程序中的ClassCastException

Posted

技术标签:

【中文标题】android应用程序中的ClassCastException【英文标题】:ClassCastException in android application 【发布时间】:2015-03-06 13:20:05 【问题描述】:

我有一个小问题。我想创建带有标题的导航抽屉,但 Eclipse 抛出了一个类转换异常。问题出在适配器上,但我找不到。你能帮我么。 这是我的适配器的代码

public class NavDrawerAdapter extends ArrayAdapter<NavDrawerItem>

private LayoutInflater inflater;

public NavDrawerAdapter(Context context, int textViewResourceId, NavDrawerItem[] objects ) 
    super(context, textViewResourceId, objects);
    this.inflater = LayoutInflater.from(context);


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    View view = null ;
    NavDrawerItem menuItem = this.getItem(position);
    if ( menuItem.getType() == NavMenuItem.ITEM_TYPE ) 
        view = getItemView(convertView, parent, menuItem );
    
    else 
        view = getSectionView(convertView, parent, menuItem);
    
    return view ;


public View getItemView( View convertView, ViewGroup parentView, NavDrawerItem navDrawerItem ) 

    NavMenuItem menuItem = (NavMenuItem) navDrawerItem ;
    NavMenuItemHolder navMenuItemHolder = null;

    if (convertView == null) 
        convertView = inflater.inflate( R.layout.navdrawer_item, parentView, false);
        TextView labelView = (TextView) convertView
                .findViewById( R.id.navmenuitem_label );
        ImageView i = (ImageView) convertView.findViewById(R.id.navmenuitem_icon);

        navMenuItemHolder = new NavMenuItemHolder();
        navMenuItemHolder.labelView = labelView ;
        navMenuItemHolder.image = i;

        convertView.setTag(navMenuItemHolder);
    

    if ( navMenuItemHolder == null ) 
        navMenuItemHolder = (NavMenuItemHolder) convertView.getTag();
    

    navMenuItemHolder.labelView.setText(menuItem.getLabel().toString());

    return convertView ;


public View getSectionView(View convertView, ViewGroup parentView,
        NavDrawerItem navDrawerItem) 

    NavMenuSection menuSection = (NavMenuSection) navDrawerItem ;
    NavMenuSectionHolder navMenuItemHolder = null;

    if (convertView == null) 
        convertView = inflater.inflate( R.layout.navdrawer_section, parentView, false);
        TextView labelView = (TextView) convertView
                .findViewById( R.id.navmenusection_label );

        navMenuItemHolder = new NavMenuSectionHolder();
        navMenuItemHolder.labelView = labelView ;
        convertView.setTag(navMenuItemHolder);
    

    if ( navMenuItemHolder == null ) 
        navMenuItemHolder = (NavMenuSectionHolder) convertView.getTag();
    

    navMenuItemHolder.labelView.setText(menuSection.getLabel().toString());

    return convertView ;


private static class NavMenuItemHolder 
    private TextView labelView;
    private ImageView image;


private static class NavMenuSectionHolder 
    private TextView labelView;



这是我的主要活动的代码

public class MainActivity extends Activity

private DrawerLayout drawerLayout;
private NavDrawerAdapter adapter;
private ListView mDrawerList;
private ImageView menu;
private RelativeLayout rightRL;


@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);
    menu = (ImageView) findViewById(R.id.imageView1);
    rightRL = (RelativeLayout) findViewById(R.id.whatYouWantInRightDrawerProfil);

    NavDrawerItem[] m = new NavDrawerItem[]
            NavMenuSection.create(100, "Demos"),
            NavMenuItem.create(101, "kako si", false, this),
            NavMenuSection.create(200, "General"),
            NavMenuItem.create(202, "Rate this app", false, this)
    ;
    adapter = new NavDrawerAdapter(this, R.layout.navdrawer_item, m);
    mDrawerList.setAdapter(adapter);




public void onRight(View view) 
    drawerLayout.openDrawer(rightRL);



这是我在 eclipse 中的 logcat

致命异常:主要 java.lang.ClassCastException:com.markoKurt.zeljko.NavDrawerAdapter$NavMenuSectionHolder 无法转换为 com.markoKurt.zeljko.NavDrawerAdapter$NavMenuItemHolder 在 com.markoKurt.zeljko.NavDrawerAdapter.getItemView(NavDrawerAdapter.java:52) 在 com.markoKurt.zeljko.NavDrawerAdapter.getView(NavDrawerAdapter.java:25) 在 android.widget.AbsListView.obtainView(AbsListView.java:2449) 在 android.widget.ListView.measureHeightOfChildren(ListView.java:1250) 在 android.widget.ListView.onMeasure(ListView.java:1162) 在 android.view.View.measure(View.java:15504) 在 android.widget.RelativeLayout.measureChildHorizo​​ntal(RelativeLayout.java:617) 在 android.widget.RelativeLayout.onMeasure(RelativeLayout.java:399) 在 android.view.View.measure(View.java:15504) 在 android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:866) 在 android.view.View.measure(View.java:15504) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 android.view.View.measure(View.java:15504) 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:833) 在 android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 在 android.view.View.measure(View.java:15504) 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2385) 在 android.view.View.measure(View.java:15504) 在 android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1979) 在 android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1222) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1395) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4526) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 在 android.view.Choreographer.doCallbacks(Choreographer.java:555) 在 android.view.Choreographer.doFrame(Choreographer.java:525) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 在 android.os.Handler.handleCallback(Handler.java:615) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:4921) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 在 dalvik.system.NativeStart.main(Native Method)

请帮帮我,提前谢谢

【问题讨论】:

【参考方案1】:

您的问题与您只得到一个空的convertView 的事实有关,因此标签内容只为NavMenuSectionHolderNavMenuItemHolder 设置了一次。通常,当您必须处理多个 convertView 时,您可以覆盖 getViewTypeCountgetItemViewType。在您的情况下,两个持有者类仅针对 ImageView 不同。所以我建议你只有一个持有者类,(膨胀一个布局),当你不需要它时隐藏ImageView

【讨论】:

【参考方案2】:

我解决了这个问题。我只需要添加

@Override
public int getViewTypeCount() 
    return 2;


@Override
public int getItemViewType(int position) 
    return this.getItem(position).getType();


@Override
public boolean isEnabled(int position) 
    return getItem(position).isEnabled();

【讨论】:

【参考方案3】:

您试图将 navDrawerItem 转换为 navMenuItem

NavMenuItem menuItem = (NavMenuItem) navDrawerItem;

改变它
NavDrawerItem drawerItem = (NavDrawerItem ) navDrawerItem;

并做相应的事情..

【讨论】:

所以我也必须在 getSectionView() 中更改它。 Insted NavMenuItem menuItem = (NavMenuItem) navDrawerItem; 但那是错误的。堆栈跟踪说java.lang.ClassCastException: com.markoKurt.zeljko.NavDrawerAdapter$NavMenuSectionHolder cannot be cast to com.markoKurt.zeljko.NavDrawerAdapter$NavMenuItemHolder【参考方案4】:

尝试像这样改变不同布局的逻辑, http://www.survivingwithandroid.com/2014/08/android-listview-with-multiple-row.html

【讨论】:

【参考方案5】:

在getItemView 和getSectionView 中你可以得到不同的视图,所以你需要检查类实例。

public View getSectionView(View convertView, ViewGroup parentView,
NavDrawerItem navDrawerItem) 

NavMenuSection menuSection;
if (navDrawerItem !=null)
if (navDrawerItem instanceof NavMenuSection)
menuSection = navDrawerItem
else 
menuSection = new NavMenuSection()
else 
menuSection = new NavMenuSection()

public View getItemView( View convertView, ViewGroup parentView, NavDrawerItem navDrawerItem ) 

NavMenuItem menuItem = (NavMenuItem) navDrawerItem ;
    NavMenuItemHolder navMenuItemHolder = null;
NavMenuSection menuSection;
if (menuItem!=null)
if (menuItem instanceof  NavMenuItem)
menuItem =  NavMenuItem
else 
menuItem = new  NavMenuItem()
else 
menuItem= new  NavMenuItem()

【讨论】:

以上是关于android应用程序中的ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章

Spark 2.3.0 SQL 无法将数据插入 hive hbase 表

java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 com.testing.models.Account

Android - 将参数传递给 Android 应用程序中的 RESTful URL

Android中的uid

如何使 Android 应用程序与 Android Studio 中的所有 6735 Android 设备兼容 [关闭]

如何检查由单独 Android 应用程序中的服务启动的 Android 应用程序是不是已完成加载?