-1

I creating in adapter radio buttons as follows:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View vi = convertView;

    if (vi == null) {
        LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        vi = li.inflate(R.layout.row, null);
    } else {
        vi = convertView;
    }

    final ItemFormRow item = items.get(position);

    v = new ViewHolder();
    v.answerGroup = (RadioGroup) vi.findViewById(R.id.answerGroup);

    v.answerGroup.removeAllViews();
    for (int i=0; i<answers.size(); i++) {
        RadioButton rb = answers.get(i);
        v.answerGroup.addView(rb);
    }

    return vi;
}

I use onSaveInstanceState for state saving items for adapter in activity:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putParcelableArrayList("test", listItems);
    super.onSaveInstanceState(outState);
}

Retrieving then in onCreate method.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        listItems = savedInstanceState.getParcelableArrayList("test");
    }

    ....
}

When I rotate the device (stop on line: v.answerGroup.addView(rb)) gets exception:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

If I removed - onSaveInstanceState, so everything works fine and an exception is not thrown.

I need to save state. Can you help me how to fix it?

kevas
  • 551
  • 2
  • 7
  • 22

1 Answers1

0

Try this:

    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder vh = new ViewHolder();

        if (convertView == null) {
            LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = li.inflate(R.layout.row, parent, false);

            // Do all necessary findViewById's here

            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }

        // Not sure what you are trying to do here. But the above should solve (or at least mitigate) the issue
        final ItemFormRow item = items.get(position);
        vh.answerGroup = (RadioGroup) convertView.findViewById(R.id.answerGroup);

        for (int i = 0; i < answers.size(); i++) {
            RadioButton rb = answers.get(i);
            vh.answerGroup.addView(rb);
        }

        return convertView;
    }

I removed your View variable since is it not needed.

EDIT

Removed this line as well vh.answerGroup.removeAllViews();

Chisko
  • 3,092
  • 6
  • 27
  • 45