通过自定义Dialog删除ExpandableListView的child item时报错ClassCastException

程序员张晴天
  • 224

报错信息如下

clipboard.png

界面是这个样子
长按childitem 弹出删除的dialog 这是一个资料汇总的activity包含4个fragment
dialog单独写了一个类

clipboard.png

public class MyDialog extends Dialog implements android.view.View.OnClickListener{

    Context context;
    IOnClickListener iOnclicklistener;
    private TextView delete;
    private String TAG="com.littletalent.activity.SumFile.MyDialog";

    public MyDialog(Context context, int theme) {
        super(context, theme);
        this.context = context;
        Log.i(TAG,"context="+context);
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialogxml);
        delete = (TextView) findViewById(R.id.delete);
        delete.setOnClickListener(this);
    }
    
    // 直接在这里面写的话就必须要将那些参数传进来,增加这个自定义控件的负担
    @Override
    public void onClick(View v) {
        //Log.i(TAG, "context="+context);
        //try{
            
        iOnclicklistener = (IOnClickListener)context;
        
                //}
//        catch(Exception e){
//            Log.i(TAG, "error");
//        }
        switch (v.getId()) {
        case R.id.delete:
            //iOnclicklistener.deleteOnClick();
            
            break;
        default:
            Log.i(TAG,"error");
            break;
        }

    }

    public interface IOnClickListener {
        
        public void deleteOnClick();

    }
}

报错的是这句

clipboard.png

IOnClickListener的实现是在fragment中

回复
阅读 2.8k
1 个回答
li21
  • 3.1k
✓ 已被采纳

原因很明朗,虽然我没有你的完整代码,但是我做了个小测试,得到了类似的crash:

10-26 21:00:03.474: E/AndroidRuntime(12410): java.lang.ClassCastException: me.li2.android.criminalintent.CrimePagerActivity cannot be cast to me.li2.android.criminalintent.CrimeFragment$Callbacks

原因是你传入的context,也就是SumFileActivity,并没有实现你定义的IOnClickListener. 所以无法强制转型。
既然你在Fragment中实现了接口,那我们可以这样做,注册一个接口,替代传入context的办法:

// MyDialog.java
    public void setOnClickListener(IOnClickListener l) {
        this.iOnclicklistener = l;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.delete:
        if (this.iOnclicklistener != null) {
            this.iOnclicklistener.deleteOnClick();
        }

然后还需要做的事件就是,在创建MyDialog的Fragment里面调用setOnClickListener.

PS: 你可以看下这个问题【什么是回调函数?一个类中的回调函数是什么作用】中我的答案,可能会对你理解 “如何处理点击事件的回调” 有所帮助。
PS+: crash log,我觉得贴文本比图好,经过markdown排版后也会好看,同时也方便答题者引用其中的内容。代码也是,你可以加上注释,指明崩溃在哪行。

宣传栏