Reputation: 57
Hi i am using extensible list view in my fragment, here when i am clicking on check box in extensible list view, i want to get the values to Main activity in array format. But app is crashing whenever am clicking on 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;
}}
here is my 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$1.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)
Actually same code worked perfectly when i tested it as separate project but when i merged into my main project app is crashing when am clicking on check box.
Upvotes: 0
Views: 76
Reputation: 2473
You are instantiating ExpandableListAdapter
with an application context, that's why you can't cast it to an Activity (That's what your error says). You must have something like new ExpandableListAdapter(getApplicationContext(),...);
somewhere. If you are doing this on MainActivity
, you must change that line to new ExpandableListAdapter(MainActivity.this,...);
Upvotes: 0
Reputation: 1353
Cast it to activity first :
Activity activity = (Activity) context;
and then use :
((MainActivity) activity).checked(selectedarray);
Upvotes: 0
Reputation: 3167
Do following some edition in code and let me know if it is working or not properly.
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;
}
and in check change, below changes
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);
}
}
});
Upvotes: 0
Reputation: 1411
Please Define you check box in getView
final CheckBox check=(CheckBox) convertView.findViewById(R.id.checkBox);
If you define it publicly than you get only last checkbox value
Upvotes: 0