0

I have a problem, and can't understand the cause of it. Anytime when onChildClick I change the background color of Expandable ListViews child item I get the change of bakground color not only the item I choose but every nineth item in current child list and other child lists are chosen. I tried this, this, and a lot of other decisions but still can't get it solved. What have I done wrong? Any help will be highly appreciated.

mListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener(){
        @Override
        public boolean onChildClick(ExpandableListView parent, View view, int groupPosition, int childPosition, long id) {

view.setBackgroundColor(Color.GREEN);

            mAdapter.notifyDataSetChanged();

            return false;
        }
    });

Adapter

public class ExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String>muscleGroupName;
private HashMap<String,List<String>>muscleChildName;
private List<Integer>muscleGroupImage;
private HashMap<Integer, List<Integer>>muscleChildImage;

public ExpandableListAdapter(Context context, List<String>muscleGroupName, HashMap<String,List<String>>muscleChildName,
                             List<Integer>muscleGroupImage, HashMap<Integer, List<Integer>>muscleChildImage){
    this.context = context;
    this.muscleGroupName = muscleGroupName;
    this.muscleChildName = muscleChildName;
    this.muscleGroupImage = muscleGroupImage;
    this.muscleChildImage = muscleChildImage;
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    return this.muscleChildName.get(this.muscleGroupName.get(groupPosition)).get(childPosition);
}

@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);
    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_child, null);
    }
    TextView childNameText = (TextView)convertView.findViewById(R.id.child_name);
    childNameText.setText(childText);

    ImageView childNameImage = (ImageView)convertView.findViewById(R.id.child_image);
    int childImage = this.muscleChildImage.get(this.muscleGroupImage.get(groupPosition)).get(childPosition);
    childNameImage.setImageResource(childImage);

    return convertView;
}

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

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

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

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    String groupTitle = (String)getGroup(groupPosition);
    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_group, null);
    }
    TextView groupNameText = (TextView)convertView.findViewById(R.id.group_name);
    groupNameText.setText(groupTitle);
    ImageView groupImageName = (ImageView)convertView.findViewById(R.id.group_image);
    int imageName = muscleGroupImage.get(groupPosition);
    groupImageName.setImageResource(imageName);
    return convertView;
}

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

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return true;
}
}
Community
  • 1
  • 1
Mikhail
  • 133
  • 2
  • 9

1 Answers1

0

if you want to just select the item use this: https://stackoverflow.com/a/16190228/6502368

but if you want to handle selection by yourself Do not recycle convert view item and save the selected item position . some thing like this :

int selectedPosition=-1;
int selectedPosition_parent=-1;



@Override
public View getChildView(int groupPosition, final int childPosition, boolean   isLastChild, View convertView, ViewGroup parent) {
    final String childText = (String)getChild(groupPosition, childPosition);

    LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(R.layout.list_child, null);

    TextView childNameText = (TextView)convertView.findViewById(R.id.child_name);
    childNameText.setText(childText);

    ImageView childNameImage = (ImageView)convertView.findViewById(R.id.child_image);
     int childImage = this.muscleChildImage.get(this.muscleGroupImage.get(groupPosition)).get(childPosition);
     childNameImage.setImageResource(childImage);

     if(childPosition==selectedPosition &&  groupPosition==selectedPosition_parent)
         {
           //change the background or anything else
         }


    return convertView;
 }

Do not forget to set selectedPosition and selectedPosition_parent in item click or whatever you handle the selection event.

Community
  • 1
  • 1
mehd azizi
  • 594
  • 1
  • 5
  • 16
  • Thank you for your answer, but when I tried your code, I don't get any cange in background color at all. So it is not the solution of my problem. – Mikhail Oct 01 '16 at 12:21
  • I want select multiple items but I think I will get it from here on. Once more, thank you! – Mikhail Oct 01 '16 at 13:36