I wrote a 3 level expandable list code which is like that:
A
|_B
|_C
D
|_E
|_F
But in my list, each row consists of buttons, edittexts etc. And I'm adding childs dynamically as you can see at the below code.
I need some help about 2 things.
1) When I click A, B is opening but when i clicked B, C is not showing in the screen.
2) When i click A or D, group position is not changing always the same which is 0. Because of that A always expands.
You can find the codes below, thank you :)
Beginning of the activity I wrote these:
public static int FIRST_LEVEL_COUNT = 1;
public static int SECOND_LEVEL_COUNT = 1;
public static int THIRD_LEVEL_COUNT = 1;
boolean firstLevel_Expanded = false;
boolean secondLevel_Expanded = false;
And then calling expandable list view from xml:
demand_table = (ExpandableListView) dialog.findViewById(R.id.demandresponsetable);
demand_table.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
demand_table.setAdapter(new ParentLevel(this));
My expandable list's code is here:
public class ParentLevel extends BaseExpandableListAdapter {
private Context context;
public ParentLevel(Context context) {
this.context = context;
}
#Override
public Object getChild(int arg0, int arg1) {
return arg1;
}
#Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
SecondLevelExpandableListView secondLevelELV = new SecondLevelExpandableListView(LoadDemandResponse.this);
secondLevelELV.setAdapter(new SecondLevelAdapter(context));
secondLevelELV.setGroupIndicator(null);
return secondLevelELV;
}
#Override
public int getChildrenCount(int groupPosition) {
return SECOND_LEVEL_COUNT;
}
#Override
public Object getGroup(int groupPosition) {
return groupPosition;
}
#Override
public int getGroupCount() {
return FIRST_LEVEL_COUNT;
}
#Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
#Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.threelevel_listrow_first, null);
final long position = getGroupId(groupPosition);
convertView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(firstLevel_Expanded == true) {
firstLevel_Expanded = false;
demand_table.expandGroup((int) position);
}
else {
firstLevel_Expanded = true;
demand_table.collapseGroup((int) position);
}
}
});
TextView text = (TextView) convertView.findViewById(R.id.Edit_eventsListEventRowText);
text.setHint("Demand Response Name");
ToggleButton toggle = (ToggleButton) convertView.findViewById(R.id.dr_status);
toggle.setText("Passıve");
toggle.setTextOff("Passıve");
toggle.setTextOn("Actıve");
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// The toggle is enabled
} else {
// The toggle is disabled
}
}
});
Button time = (Button) convertView.findViewById(R.id.add_time);
time.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
SECOND_LEVEL_COUNT++;
}
});
}
return convertView;
}
#Override
public boolean hasStableIds() {
return true;
}
#Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
public class SecondLevelExpandableListView extends ExpandableListView {
public SecondLevelExpandableListView(Context context) {
super(context);
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//999999 is a size in pixels. ExpandableListView requires a maximum height in order to do measurement calculations.
heightMeasureSpec = MeasureSpec.makeMeasureSpec(999999, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public class ThirdLevelExpandableListView extends ExpandableListView {
public ThirdLevelExpandableListView(Context context) {
super(context);
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//999999 is a size in pixels. ExpandableListView requires a maximum height in order to do measurement calculations.
heightMeasureSpec = MeasureSpec.makeMeasureSpec(999999, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public class SecondLevelAdapter extends BaseExpandableListAdapter {
private Context context;
public SecondLevelAdapter(Context context) {
this.context = context;
}
#Override
public Object getGroup(int groupPosition) {
return groupPosition;
}
#Override
public int getGroupCount() {
return 1;
}
#Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
#Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.threelevel_listrow_second, null);
//text.setText("SECOND LEVEL");
convertView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
if(secondLevel_Expanded == true) {
secondLevel_Expanded = false;
demand_table.expandGroup(groupPosition);
}
else {
secondLevel_Expanded = true;
demand_table.collapseGroup(groupPosition);
}
}
});
final View finalConvertView = convertView;
final EditText start = (EditText) convertView.findViewById(R.id.edit_starttime);
start.setInputType(InputType.TYPE_NULL);
start.requestFocus();
start.setHint("Start Time");
start.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Calendar mcurrentTime = Calendar.getInstance();
int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
int minute = mcurrentTime.get(Calendar.MINUTE);
TimePickerDialog mTimePicker;
mTimePicker = new TimePickerDialog(finalConvertView.getContext(), new TimePickerDialog.OnTimeSetListener() {
#Override
public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
start.setText( selectedHour + ":" + selectedMinute);
}
}, hour, minute, true);//Yes 24 hour time
mTimePicker.setTitle("Select Time");
mTimePicker.show();
}
});
final EditText end = (EditText) convertView.findViewById(R.id.edit_endtime);
end.setInputType(InputType.TYPE_NULL);
end.requestFocus();
end.setHint("End Time");
end.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Calendar mcurrentTime = Calendar.getInstance();
int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
int minute = mcurrentTime.get(Calendar.MINUTE);
TimePickerDialog mTimePicker;
mTimePicker = new TimePickerDialog(finalConvertView.getContext(), new TimePickerDialog.OnTimeSetListener() {
#Override
public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
end.setText( selectedHour + ":" + selectedMinute);
}
}, hour, minute, true);//Yes 24 hour time
mTimePicker.setTitle("Select Time");
mTimePicker.show();
}
});
Button offer = (Button) convertView.findViewById(R.id.add_offer);
offer.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
THIRD_LEVEL_COUNT++;
}
});
}
return convertView;
}
#Override
public Object getChild(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public View getChildView(final int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ThirdLevelExpandableListView thirdLevelELV = new ThirdLevelExpandableListView(LoadDemandResponse.this);
thirdLevelELV.setAdapter(new ThirdLevelAdapter(context));
thirdLevelELV.setGroupIndicator(null);
return thirdLevelELV;
}
#Override
public int getChildrenCount(int groupPosition) {
return THIRD_LEVEL_COUNT;
}
#Override
public boolean hasStableIds() {
return true;
}
#Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
public class ThirdLevelAdapter extends BaseExpandableListAdapter {
private Context context;
public ThirdLevelAdapter(Context context) {
this.context = context;
}
#Override
public Object getGroup(int groupPosition) {
return groupPosition;
}
#Override
public int getGroupCount() {
return 1;
}
#Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
#Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.threelevel_listrow_third, null);
EditText quantity = (EditText) convertView.findViewById(R.id.edit_quantity);
quantity.setHint("Reserve Quantity");
EditText price = (EditText) convertView.findViewById(R.id.edit_price);
price.setHint("Offered Price");
}
return convertView;
}
#Override
public Object getChild(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public View getChildView(final int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if(convertView != null) {
convertView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
demand_table.expandGroup(groupPosition);
}
});
}
return convertView;
}
#Override
public int getChildrenCount(int groupPosition) {
return THIRD_LEVEL_COUNT;
}
#Override
public boolean hasStableIds() {
return true;
}
#Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
Related
I have a display problem with my 4-stage expandableList.
I can display my data, expand them but the last child does not display the whole list. How would you do it?
Here is a picture and the part of the code in question, I think it comes from the fact that I declare the size of the last list.
public static class ThirdLevelAdapter extends BaseExpandableListAdapter {
private Context context;
private ArrayList<String> materiau;
private HashMap<String, ArrayList<MatosItem>> materiauItemList;
int c = 1;
LayoutInflater inflater3;
public ThirdLevelAdapter(Context context,HashMap<String, ArrayList<MatosItem>> materiauItemList,ArrayList<String> materiau) {
this.context = context;
this.materiauItemList = materiauItemList;
this.materiau = materiau;
this.inflater3 = LayoutInflater.from(context);
}
#Override
public Object getGroup(int groupPosition) {
return materiau.get(groupPosition);
}
#Override
public int getGroupCount() {
return materiau.size();
}
#Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
#Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext())
.inflate(android.R.layout.simple_expandable_list_item_1,
parent,false);
//Initialization and assign variable
TextView textView = convertView.findViewById(android.R.id.text1);
//Initial string pour le nom de famille
String sGroup = String.valueOf(getGroup(groupPosition));
//Set text on text view
textView.setText(sGroup);
//Set text style bold
textView.setTypeface(null, Typeface.BOLD);
//Set text color
//textView.setBackgroundColor(Color.parseColor("#FF018786"));
textView.setTextColor(Color.parseColor("#FF018786"));
textView.setTextSize(1,20);
//Return View
}
return convertView;
}
#Override
public Object getChild(int groupPosition, int childPosition) {
return materiauItemList.get(materiau.get(groupPosition)).get(childPosition);
}
#Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
view = inflater3.inflate(R.layout.adapter_item2, null);
//get information about item
MatosItem currentItem = (MatosItem) getChild(i,i1);
String itemName = currentItem.getName();
String itemNumber = currentItem.getNumber();
Boolean intemCheck = currentItem.getCheck();
String itemRef = currentItem.getRef();
String itemCodefourn = currentItem.getCodefourn();
//get item name view
TextView itemNameView = view.findViewById(R.id.name);
itemNameView.setText(itemName);
//get item number view
TextView itemNumberView = view.findViewById(R.id.item_number);
itemNumberView.setText(itemNumber);
//get item ref view
TextView itemRefView = view.findViewById(R.id.ref);
itemRefView.setText(itemRef);
//get item codefournisseur
TextView itemCodefournView = view.findViewById(R.id.codefourn);
itemCodefournView.setText(itemCodefourn);
LinearLayout layout = view.findViewById(R.id.compteur);
Button btnplus = view.findViewById(R.id.btnplus);
Button btnmoins = view.findViewById(R.id.btnmoins);
TextView text = view.findViewById(R.id.text);
if(intemCheck){
//checkBox.setChecked(true);
mdescription.add(itemName);
mid.add(itemNumber);
mref.add(itemRef);
mcodefourn.add(itemCodefourn);
}
view.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
layout.setVisibility(View.VISIBLE);
mdescription.add(""+itemName);
mid.add(""+itemNumber);
mref.add(itemRef);
mcodefourn.add(itemCodefourn);
//checkBox.setChecked(true);
//Toast.makeText(viewGroup.getContext(),itemName , Toast.LENGTH_SHORT).show();
}
});
btnplus.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
c=c+1;
text.setText(""+c);
mdescription.add(""+itemName);
mid.add(""+itemNumber);
mref.add(itemRef);
mcodefourn.add(itemCodefourn);
}
});
btnmoins.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
c=c-1;
text.setText(""+c);
mdescription.remove(""+itemName);
mid.remove(""+itemNumber);
mref.remove(itemRef);
mcodefourn.remove(itemCodefourn);
}
});
return view;
}
#Override
public int getChildrenCount(int groupPosition) {
return materiauItemList.get(materiau.get(groupPosition)).size();
}
#Override
public boolean hasStableIds() {
return true;
}
#Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
level 1-2 and 3 work fine and i can scroll
level 4 is not displayed completely and I can't scroll
Thank you for your help
I have a problem with my ExpendableList. I am trying
to make a 3 level expandablelist. The display on the 3 levels works
fine and stays tidy as it should. But I don't know why, the
subcategories are duplicated. Here is the whole code with the adapter
and the creation of my HashMap. If you have an idea where this comes
from you would help me a lot!
public HashMap<String, HashMap<String, ArrayList<String>>>typeItemList;
public HashMap<String, ArrayList<String>>materiauItemList;
public HashMap<String, HashMap<String, HashMap<String, ArrayList<String>>>> familleItemList;
private ExpandableListView expandableListView;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<String> famille = new ArrayList<>();
ArrayList<String> type= new ArrayList<>();
ArrayList<String> materiaux = new ArrayList<>();
familleItemList = new HashMap<>();
for(int g = 1; g<=5; g++) {
famille.add("famille "+g);
HashMap<String, HashMap<String, ArrayList<String>>> typeItemList1 = new HashMap<>();
for (int h = 1; h <= 4; h++) {
type.add("type " + g+h);
HashMap<String, ArrayList<String>> matItemList = new HashMap<>();
for (int i = 1; i <= 4; i++) {
materiaux.add("materiau " + g+h+i);
ArrayList<String> outils = new ArrayList<>();
for (int j = 1; j <= 10; j++) {
outils.add("outils " + g+h+i+j);
}
matItemList.put("materiau " + i, outils);
}
typeItemList1.put("type " + h, matItemList);
}
familleItemList.put("famille "+g, typeItemList1);
}
expandableListView = (ExpandableListView) findViewById(R.id.mainList);
expandableListView.setAdapter(new ParentLevel(this,familleItemList, famille ));
}
public class ParentLevel extends BaseExpandableListAdapter {
private Context context;
ArrayList<String> famille;
HashMap<String, HashMap<String, HashMap<String, ArrayList<String>>>> familleItemList;
public ParentLevel(Context context, HashMap<String, HashMap<String, HashMap<String, ArrayList<String>>>> familleItemList, ArrayList<String> famille ) {
this.context = context;
this.familleItemList = familleItemList;
this.famille=famille;
}
//
#Override
public int getGroupCount() {
return famille.size();
}
#Override
public int getChildrenCount(int i) {
return familleItemList.get(famille.get(i)).size();
}
#Override
public Object getGroup(int i) {
return famille.get(i);
}
#Override
public Object getChild(int i, int i1) {
return familleItemList.get(famille.get(i)).get(i1);
}
#Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
#Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
#Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
SecondLevelExpandableListView secondLevelELV = new SecondLevelExpandableListView(MainActivity.this);
ArrayList<String> list = new ArrayList<>();
for (String i : Objects.requireNonNull(familleItemList.get(famille.get(groupPosition))).keySet()) {
list.add(i);}
typeItemList = new HashMap<>();
typeItemList=familleItemList.get(getGroup(groupPosition));
secondLevelELV.setAdapter(new SecondLevelAdapter(context, typeItemList,list ));
secondLevelELV.setGroupIndicator(null);
return secondLevelELV;
}
#Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_first, null);
TextView text = (TextView) convertView.findViewById(R.id.eventsListEventRowText);
String sGroup = String.valueOf(getGroup(groupPosition));
text.setText(sGroup);
}
return convertView;
}
#Override
public boolean hasStableIds() {
return true;
}
#Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
public static class SecondLevelExpandableListView extends ExpandableListView {
public SecondLevelExpandableListView(Context context) {
super(context);
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//999999 is a size in pixels. ExpandableListView requires a maximum height in order to do measurement calculations.
heightMeasureSpec = MeasureSpec.makeMeasureSpec(999999, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public class SecondLevelAdapter extends BaseExpandableListAdapter {
private Context context;
private ArrayList<String> type;
private HashMap<String, HashMap<String, ArrayList<String>>> typeItemList;
public SecondLevelAdapter(Context context,HashMap<String, HashMap<String, ArrayList<String>>> typeItemList, ArrayList<String> type) {
this.context = context;
this.typeItemList = typeItemList;
this.type=type;
}
#Override
public int getGroupCount() {
return type.size();
}
#Override
public int getChildrenCount(int i) {
return typeItemList.get(type.get(i)).size();
}
#Override
public Object getGroup(int i) {
return type.get(i);
}
#Override
public Object getChild(int i, int i1) {
return typeItemList.get(type.get(1)).get(i1);
}
#Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
#Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_third, null);
TextView text = (TextView) convertView.findViewById(R.id.eventsListEventRowText);
String sGroup = String.valueOf(getGroup(groupPosition));
text.setText(sGroup);
}
return convertView;
}
#Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ThirdLevelExpandableListView thridLevelELV = new ThirdLevelExpandableListView(MainActivity.this);
ArrayList<String> list = new ArrayList<>();
for (String i : typeItemList.get(getGroup(groupPosition)).keySet() ){
list.add(i);}
materiauItemList=new HashMap<>();
materiauItemList = typeItemList.get(getGroup(groupPosition));
thridLevelELV.setAdapter(new ThirdLevelAdapter(context,materiauItemList,list));
thridLevelELV.setGroupIndicator(null);
return thridLevelELV;
}
#Override
public boolean hasStableIds() {
return true;
}
#Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
public static class ThirdLevelExpandableListView extends ExpandableListView {
public ThirdLevelExpandableListView(Context context) {
super(context);
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//999999 is a size in pixels. ExpandableListView requires a maximum height in order to do measurement calculations.
heightMeasureSpec = MeasureSpec.makeMeasureSpec(99999, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public static class ThirdLevelAdapter extends BaseExpandableListAdapter {
private Context context;
private ArrayList<String> materiau;
private HashMap<String, ArrayList<String>> materiauItemList;
public ThirdLevelAdapter(Context context,HashMap<String, ArrayList<String>> materiauItemList,ArrayList<String> materiau) {
this.context = context;
this.materiauItemList = materiauItemList;
this.materiau = materiau;
}
#Override
public Object getGroup(int groupPosition) {
return materiau.get(groupPosition);
}
#Override
public int getGroupCount() {
return materiau.size();
}
#Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
#Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_four, null);
TextView text = (TextView) convertView.findViewById(R.id.eventsListEventRowText);
text.setText(String.valueOf(getGroup(groupPosition)));
}
return convertView;
}
#Override
public Object getChild(int groupPosition, int childPosition) {
return materiauItemList.get(materiau.get(groupPosition)).get(childPosition);
}
#Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row_second, null);
TextView text = (TextView) convertView.findViewById(R.id.eventsListEventRowText);
String outils = String.valueOf(getChild(groupPosition, childPosition));
text.setText(outils);
}
return convertView;
}
#Override
public int getChildrenCount(int groupPosition) {
return materiauItemList.get(materiau.get(groupPosition)).size();
}
#Override
public boolean hasStableIds() {
return true;
}
#Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
}
[family photo displayed correctly][1] [photo of repeating types][2]
[photo of tools that are also repeated][3]
Thank you for your feedback.
[1]: https://i.stack.imgur.com/8TiQa.png [2]:
https://i.stack.imgur.com/LOMol.png [3]:
https://i.stack.imgur.com/hdFAE.png
I am using checkboxes in all child view elements in ExpandableListView. To clear all checkboxes in one go, I am using a button clearFilters and the code for the Adapter class and the button click event is below.
Clicking the button doesn't do anything at all. I want to clear all checkboxes when the button is clicked.Any help is greatly appreciated.
ExpandableListAdapterClass:
public class ExpandableListViewAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> expandableListTitle;
private Map<String, List<ChildViewModel>> expandableListDetail;
private static List<ChildViewHolder> checkedViewHolders=new ArrayList<>();
static int checkedBoxesCount;
public ExpandableListViewAdapter(Context context, List<String> expandableListTitle, Map<String,
List<ChildViewModel>> expandableListDetail) {
this.context = context;
this.expandableListTitle = expandableListTitle;
this.expandableListDetail = expandableListDetail;
}
#Override
public int getGroupCount() {
return expandableListTitle.size();
}
#Override
public int getChildrenCount(int groupPosition) {
return expandableListDetail.get(expandableListTitle.get(groupPosition)).size();
}
#Override
public String getGroup(int groupPosition) {
return expandableListTitle.get(groupPosition);
}
#Override
public ChildViewModel getChild(int groupPosition, int childPosition) {
return expandableListDetail.get(expandableListTitle.get(groupPosition)).get(childPosition);
}
#Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
#Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public boolean hasStableIds() {
return false;
}
#Override
public View getGroupView(int groupPosition, boolean b, View view, ViewGroup viewGroup) {
String listTitle=getGroup(groupPosition);
GroupViewHolder groupViewHolder;
if(view==null){
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=inflater.inflate(R.layout.expanded_list_group,null);
groupViewHolder=new GroupViewHolder();
groupViewHolder.listTitleTextView=(TextView)view.findViewById(R.id.txtExpandedListTitle);
view.setTag(groupViewHolder);
}else {
groupViewHolder=(GroupViewHolder)view.getTag();
}
groupViewHolder.listTitleTextView.setText(listTitle);
return view;
}
#Override
public View getChildView(final int groupPosition, final int childPosition, boolean b, View view, ViewGroup viewGroup) {
final ChildViewModel expandedListText=getChild(groupPosition,childPosition);
final ChildViewHolder childViewHolder;
if(view==null){
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=inflater.inflate(R.layout.expanded_list_item,null);
childViewHolder=new ChildViewHolder();
childViewHolder.expandedListTextView=(TextView)view.findViewById(R.id.txtExpandedListItem);
childViewHolder.checkBox=(CheckBox)view.findViewById(R.id.expandeditem_chkbox);
view.setTag(childViewHolder);
}else {
childViewHolder=(ChildViewHolder)view.getTag();
}
childViewHolder.expandedListTextView.setText(expandedListText.getName());
if(expandedListText.isCheckStatus()){
childViewHolder.checkBox.setChecked(true);
}else {
childViewHolder.checkBox.setChecked(false);
}
childViewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
ChildViewModel model;
if(childViewHolder.checkBox.isChecked()){
checkedBoxesCount++;
model=expandableListDetail.get(expandableListTitle.get(groupPosition)).get(childPosition);
model.setCheckStatus(true);
expandableListDetail.get(expandableListTitle.get(groupPosition)).set(childPosition,model);
checkedViewHolders.add(childViewHolder);
notifyDataSetChanged();
Toast.makeText(context,"Checked value is"+expandableListDetail.get(expandableListTitle.get(groupPosition)).get(childPosition),Toast.LENGTH_SHORT).show();
}else {
checkedBoxesCount--;
if(checkedBoxesCount==0){
Toast.makeText(context,"nothing checked",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context,"unchecked",Toast.LENGTH_SHORT).show();
}
model=expandableListDetail.get(expandableListTitle.get(groupPosition)).get(childPosition);
model.setCheckStatus(false);
checkedViewHolders.remove(childViewHolder);
expandableListDetail.get(expandableListTitle.get(groupPosition)).set(childPosition,model);
notifyDataSetChanged();
}
}
});
return view;
}
public void clearChecks(){
for(int i=0;i<checkedViewHolders.size();i++){
checkedViewHolders.get(i).checkBox.setChecked(false);
notifyDataSetChanged();
}
checkedViewHolders.clear();
}
#Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public class GroupViewHolder {
TextView listTitleTextView;
}
public class ChildViewHolder {
TextView expandedListTextView;
CheckBox checkBox;
}
}
Here is the MainActivity class:
public class MainActivity extends AppCompatActivity {
ExpandableListView mExpandableListView;
ExpandableListViewAdapter mExpandableListAdapter;
Button clearFilters;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mExpandableListView=(ExpandableListView)findViewById(R.id.expandedListView);
clearFilters=(Button)findViewById(R.id.btnClearFilter);
mExpandableListAdapter=new ExpandableListViewAdapter(MainActivity.this,getTitles(),getNames());
mExpandableListView.setAdapter(mExpandableListAdapter);
clearFilters.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
mExpandableListAdapter.clearChecks();
}
});
}
}
If the motive is to simply uncheck all checkboxes, we can use this technique to iterate through the Hashmap and set all checked status to false. It will clear all checkboxes in all childViews.
public void clearChecks(){
for (List<ChildViewModel> value:expandableListDetail.values()) {
for(ChildViewModel sample:value){
sample.setCheckStatus(false);
}
}
notifyDataSetChanged();
I have a ExpandableListView in a Fragment.
I'm posting a request to the server using RoboSpice onCreateView.
I want to be able to update the list twice, once when I get the data from the cache and second after the response returns.
For some reason the list is not populated.
I was able to populate it when I instantiate a new adapter and set the adapter for list, but for some reason it doesn't work on some android devices.
This is the code I'm using:
Fragment
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
_expandableListAdapter = new GroupsExpandableListAdapter(getActivity(), getSpiceManager());
_groupListView.setAdapter(_expandableListAdapter);
DBServerHelper.Groups.getByBusinessId(getActivity(), getSpiceManager(), getDBHelper(), _clientBusiness.getId(),
new CachedRequestListener<ClientGroup.List>(getDBHelper(), getActivity()) {
#Override
// This method runs twice, after the data comes from the cache and once the request succeed
public void onRequestFromCache(ClientGroup.List clientGroups) {
if (clientGroups == null || clientGroups.isEmpty()) {
Ln.d("Received clientGroups " + clientGroups == null ? "null" : "empty" + " form request GetByBusinessId");
return;
}
_expandableListAdapter.clear();
_expandableListAdapter.setGroups(clientGroups);
_expandableListAdapter.notifyDataSetChanged();
_groupListView.invalidateViews();
}
#Override
public void onRequestFailure(SpiceException spiceException) {
super.onRequestFailure(spiceException);
Ln.e(spiceException, "Failed to get groups ");
Toaster.showLong(getActivity(), "Could not get businesses groups: " + spiceException.getMessage());
}
});
}
GroupsExpandableListAdapter
public class GroupsExpandableListAdapter extends BaseExpandableListAdapter {
private ClientGroup.List _data;
private Activity _activity;
/**
* It is only possible to create a group using the factory method create below
* #param activity
*/
public GroupsExpandableListAdapter(Activity activity, SpiceManager manager) {
super();
_data = new ClientGroup.List();
_activity = activity;
_manager = manager;
}
#Override
public int getGroupCount() {
return _data.size();
}
#Override
public int getChildrenCount(int groupPosition) {
return _data.size();
}
#Override
public Object getGroup(int groupPosition) {
return _data.get(groupPosition).getName();
}
#Override
public Object getChild(int groupPosition, int childPosition) {
return _data.get(groupPosition).getDeleteReason();
}
#Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
#Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
#Override
public boolean hasStableIds() {
return false;
}
public void clear() {
_data.clear();
}
public void setGroups(ClientGroup.List groups) {
_groups = groups;
}
#Override
public View getGroupView(final int groupPosition, final boolean isExpanded, final View convertView,
final ViewGroup parent) {
View v;
if (convertView == null) {
LayoutInflater li = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.group_list_group, parent, false);
TextView textView = (TextView) v.findViewById(R.id.groupName);
textView.setText((CharSequence) _data.get(groupPosition).getName());
((ImageView) v.findViewById(R.id.groupIndicator))
.setImageResource(isExpanded ? R.drawable.arrow_up_turquoise : R.drawable.arrow_down_white);
} else {
v = convertView;
}
return v;
}
#Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
LayoutInflater li = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.group_list_child, parent, false);
} else {
v = convertView;
}
TextView joinGroupButton = (TextView) v.findViewById(R.id.joinGroupButton);
final ClientGroup group = _data.get(groupPosition);
String leaveGroupStr = _activity.getString(R.string.leave_group);
String joinGroupStr = _activity.getString(R.string.join_group);
return v;
}
#Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
}
Any suggestions?
Thanks!
I'm having trouble with setting an OnClickListener to list items in my ExpandableListActivity. The code structure matches the following example:
ExpandableListAdapter mAdapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Assign the adapter
mAdapter = new MyExpandableListAdapter();
setListAdapter(mAdapter);
}
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
private String[] groups = { "foo", "bar"};
private String[][] children = {
{"fooA", "barA"},
{"fooB", "barB"}
};
public Object getChild(int groupPosition, int childPosition) {
return children[groupPosition][childPosition];
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public int getChildrenCount(int groupPosition) {
return children[groupPosition].length;
}
public TextView getGenericView() {
// Layout parameters for the ExpandableListView
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 64);
TextView textView = new TextView(Calculations.this);
textView.setLayoutParams(lp);
// Center the text vertically
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
// Set the text starting position
textView.setPadding(64, 0, 0, 0);
return textView;
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getChild(groupPosition, childPosition).toString());
textView.setPadding(98, 0, 0, 0);
return textView;
}
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}
public int getGroupCount() {
return groups.length;
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getGroup(groupPosition).toString());
return textView;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public boolean hasStableIds() {
return true;
}
}
Once I'm able to set the listener, I'll most likely do something like this:
// Listener
{
switch(groupPosition) {
case 0:
switch(childPosition) {
case 0:
selected = 00;
return true;
}
}
}// Close listener
Please tell me if I'm not being clear enough.
You should override onChildClick() in your activity.
boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id)
Override this for receiving callbacks when a child has been clicked.