I have an ExpandableListView with a checkbox next to the group name, and when expanding, with checkbox children.
Suppose I have 4 groups with 50 children. When the group expands, and I click on the "Select All" button, everything works fine, all the checkboxes are selected and retain their state if I scroll.
But if I scroll the list to the last child of the list, scrolling fails after that (scrolling up and then touching the screen to stop scrolling no longer works), clicking on the group no longer works until I go to the selectall checkbox. When clicking on the child flag does nothing, I have to click on the selectall flag so that everything works.
I changed the "Modified state of the child" checkbox, the group checkbox and tried many ways, but I can not find a solution to this. Do you have an idea where he came from?
public class ExpandableListAdapter extends BaseExpandableListAdapter { LayoutInflater cinflater; LayoutInflater ginflater; ArrayList<Group> array; Context context; public ExpandableListAdapter(Context context, ArrayList<Group> array) { super(); cinflater = LayoutInflater.from(context); ginflater = LayoutInflater.from(context); this.array = array; this.context = context; } public class ChildViewHolder { CheckBox contactcheckbox; TextView name; } @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return array.get(groupPosition).getContacts().size(); } private OnCheckedChangeListener contactchecklistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton checkboxView, boolean isChecked) { Contact contact = (Contact) checkboxView.getTag(); contact.setCheck(isChecked); } }; @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHolder cholder; if(convertView == null){ cholder = new ChildViewHolder(); convertView = cinflater.inflate(R.layout.childsitems, null); cholder.name = (TextView) convertView.findViewById(R.id.childnametextview); cholder.contactcheckbox = (CheckBox) convertView.findViewById(R.id.childcheckbox); cholder.contactcheckbox.setOnCheckedChangeListener(contactchecklistener); convertView.setTag(cholder); }else{ cholder = (ChildViewHolder) convertView.getTag(); } cholder.contactcheckbox.setTag(array.get(groupPosition).getContacts().get(childPosition)); cholder.contactcheckbox.setChecked(array.get(groupPosition).getContacts().get(childPosition).isCheck()); cholder.name.setText(array.get(groupPosition).getContacts().get(childPosition).getName()); return convertView; } public class GroupViewHolder { TextView groupname; CheckBox groupcheck; } @Override public int getGroupCount() { // TODO Auto-generated method stub return array.size(); } private OnCheckedChangeListener groupchecklistener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int index = (Integer) buttonView.getTag(); for(int i = 0;i<array.get(index).getContacts().size();i++){ array.get(index).getContacts().get(i).setCheck(isChecked); } array.get(index).setCheck(isChecked); notifyDataSetChanged(); } }; @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewHolder gholder; if(convertView==null){ gholder = new GroupViewHolder(); convertView = ginflater.inflate(R.layout.groupsitems,null); gholder.groupname = (TextView)convertView.findViewById(R.id.groupnametextview); gholder.groupcheckbox = (CheckBox)convertView.findViewById(R.id.groupcheckbox); gholder.groupcheckbox.setOnCheckedChangeListener(groupchecklistener); convertView.setTag(gholder); }else{ gholder = (GroupViewHolder)convertView.getTag(); } gholder.groupname.setText(array.get(groupPosition).getGroupname()); gholder.groupname.setTextSize(24); gholder.groupname.setTextColor(Color.parseColor("#FF858585")); gholder.groupname.setTypeface(Typeface.DEFAULT, Typeface.BOLD); int paddingleft = 48; // 38 dps final float scale = getResources().getDisplayMetrics().density; int dpvalue = (int) (paddingleft * scale + 0.5f); gholder.groupname.setPadding(dpvalue, 16, 0, 16); gholder.groupcheckbox.setTag(groupPosition); gholder.groupcheckbox.setChecked(array.get(groupPosition).isCheck()); if(isExpanded == true){ convertView.setBackgroundDrawable(getResources().getDrawable(R.drawable.expandedbackground)); }else{ convertView.setBackgroundColor(Color.TRANSPARENT); } return convertView; } @Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return null; } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return 0; } @Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return null; } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return 0; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return false; } }
groupsitems.xml:
<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <CheckBox android:id="@+id/groupcheckbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginTop="12dp" android:focusable="false" android:gravity="right|center" android:paddingRight="10dp" /> <TextView android:id="@+id/groupnametextview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_toLeftOf="@+id/groupcheckbox" android:focusableInTouchMode="false" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="#FF858585" android:textStyle="bold" /> </RelativeLayout>
childitems.xml:
<RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginTop="8dp" android:paddingLeft="8dp" > <TextView android:id="@+id/childnametextview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/childcheckbox" android:gravity="right|center" android:paddingLeft="16dp" android:textColor="#FFAFAFAF" android:textSize="16sp" android:textStyle="bold" /> <CheckBox android:id="@+id/childcheckbox" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> </RelativeLayout>