簡體   English   中英

Android應用程式中的ClassCastException

[英]ClassCastException in android application

我有一點問題。 我想創建帶有標題的導航抽屜,但是日食引發了類強制轉換異常。 問題出在適配器,但我找不到它。 你能幫我么。 這是我的適配器的代碼

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);
}

}

這是我的日食日志

致命例外:main java.lang.ClassCastException:com.markoKurt.zeljko.NavDrawerAdapter $ NavMenuSectionHolder無法轉換為com.markoKurt.zeljko.NavDrawerAdapter $ NavMenuItemHolder,位於com.markoKurt.zeljko.NavDrawerAdapter.getItemView(NavDrawerAdapter.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.widget.FrameLayout.onMeas上的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059)) ure(FrameLayout.java:310)位於android.view.View.measure(View.java:15504)位於android.widget.LinearLayout.measureVertical(LinearLayout.java:833)位於android.widget.LinearLayout.onMeasure(LinearLayout.java :574)at android.view.View.measure(View.java:15504)com。android.widget.FrameLayout.onMeasure(FrameGroup.java:310)android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) .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 android.view.Choreographer $ CallbackRecord.run(Choreographer.java:725)上的.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:4526)在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 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1027)上java.lang.reflect.Method.invoke(Method.java:511)上的.reflect.Method.invokeNative(本機方法) dalvik.system.NativeStart.main上的.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)(本機方法)

請幫助我,並在此先感謝

您的問題與以下事實有關:您僅獲得一個null convertView ,因此NavMenuSectionHolderNavMenuItemHolder設置了一次標記內容。 通常,當您必須處理多個convertView時,可以重寫getViewTypeCountgetItemViewType 在您的情況下,兩個Holder類僅在ImageView有所不同。 因此,我建議您只使用一個holder類(擴大一種布局),並在不需要時隱藏ImageView

我解決了問題。 我只需要添加

@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();
}

您試圖將navDrawerItem轉換為navMenuItem

NavMenuItem menuItem = (NavMenuItem) navDrawerItem;

用它改變

NavDrawerItem drawerItem = (NavDrawerItem ) navDrawerItem;

然后做相應的..

在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()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM