在 android 的可扩展列表视图中选择复选框时应用程序崩溃

App crashing while selecting check box in extensible list view in android

您好,我在我的片段中使用可扩展列表视图,在这里,当我单击可扩展列表视图中的复选框时,我想以数组格式获取 Main activity 的值。但是每当我点击 checkbox.

时,应用程序就会崩溃

ExpandableListAdapter

package com.example.limitscale.beautylog;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.limitscale.beautylog.model.BookedInfo;

public class ExpandableListAdapter extends BaseExpandableListAdapter {
private Context _context;
private List<String> _listDataHeader; // header titles
// child data in format of header title, child title
private HashMap<String, List<String>> _listDataChild;
ArrayList<BookedInfo> selectedarray = new ArrayList<BookedInfo>();
CheckBox check;

public ExpandableListAdapter(Context context, List<String> listDataHeader, HashMap<String, List<String>> listChildData) {
    this._context = context;
    this._listDataHeader = listDataHeader;
    this._listDataChild = listChildData;
}

@Override
public Object getChild(int groupPosition, int childPosititon) {
    return this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .get(childPosititon);
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

@Override
public View getChildView(int groupPosition, final int childPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {
    final String childText = (String) getChild(groupPosition, childPosition);
    String valamt[]  = childText.split(",");

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_item, null);
    }

    final LinearLayout content=(LinearLayout) convertView.findViewById(R.id.content);
    final TextView txtListChild = (TextView) convertView.findViewById(R.id.lblListItem);
    final TextView price = (TextView) convertView.findViewById(R.id.aMount);
    check=(CheckBox) convertView.findViewById(R.id.checkBox);
    txtListChild.setText(valamt[0]);
    price.setText("Rs" + valamt[1]);

    check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                BookedInfo bookedInfo = new BookedInfo();
                String check = "1";
                bookedInfo.setServiceName(txtListChild.toString());
                bookedInfo.setmServicePrice(price.toString());
                bookedInfo.setmBrandQty(check);
                selectedarray.add(bookedInfo);
                ((MainActivity) _context).checked(selectedarray);
            }
        }
    });

    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();
}

@Override
public Object getGroup(int groupPosition) {
    return this._listDataHeader.get(groupPosition);
}

@Override
public int getGroupCount() {
    return this._listDataHeader.size();
}

@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    String headerTitle = (String) getGroup(groupPosition);
    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_group, null);
    }

    TextView lblListHeader = (TextView) convertView.findViewById(R.id.lblListHeader);
    lblListHeader.setTypeface(null, Typeface.BOLD);
    lblListHeader.setText(headerTitle);

    return convertView;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return true;
}}

这是我的logcat

05-20 12:27:21.715  30353-30353/com.example.limitscale.beautylog E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.limitscale.beautylog, PID: 30353
java.lang.ClassCastException: android.app.Application cannot be cast to com.example.limitscale.beautylog.MainActivity
        at com.example.limitscale.beautylog.ExpandableListAdapter.onCheckedChanged(ExpandableListAdapter.java:73)
        at android.widget.CompoundButton.setChecked(CompoundButton.java:127)
        at android.widget.CompoundButton.toggle(CompoundButton.java:87)
        at android.widget.CompoundButton.performClick(CompoundButton.java:99)
        at android.view.View$PerformClick.run(View.java:18491)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5336)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:873)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:689)
        at dalvik.system.NativeStart.main(Native Method)

当我将它作为单独的项目进行测试时,实际上相同的代码工作得很好,但是当我合并到我的主项目中时,当我点击复选框时,应用程序崩溃了。

请在 getView 中定义复选框

final CheckBox check=(CheckBox) convertView.findViewById(R.id.checkBox);

如果您公开定义它,那么您只会获得最后一个复选框值

按照某些版本的代码进行操作,让我知道它是否正常工作。

 public ExpandableListAdapter(Context context, List<String> listDataHeader, HashMap<String, List<String>> listChildData, Activity activity) 
 {
    this._context = context;
    this._listDataHeader = listDataHeader;
    this._listDataChild = listChildData;
    this.activity = activity;
 }

并检查更改,以下更改

check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            BookedInfo bookedInfo = new BookedInfo();
            String check = "1";
            bookedInfo.setServiceName(txtListChild.toString());
            bookedInfo.setmServicePrice(price.toString());
            bookedInfo.setmBrandQty(check);
            selectedarray.add(bookedInfo);
            ((MainActivity) activity).checked(selectedarray);
        }
    }
});

首先将其转换为 activity:

Activity activity = (Activity) context;

然后使用:

((MainActivity) activity).checked(selectedarray);

您正在使用应用程序上下文实例化 ExpandableListAdapter,这就是您不能将其转换为 Activity 的原因(这就是您的错误所在)。你必须在某处有类似 new ExpandableListAdapter(getApplicationContext(),...); 的东西。如果您在 MainActivity 上执行此操作,则必须将该行更改为 new ExpandableListAdapter(MainActivity.this,...);