1

我编写了BaseExpandableListAdapter的实现,它也覆盖了 getChildType 和 getChildView 方法。有10个小组,其中4个有孩子。

以下实现适用于模拟器和经过测试的 htc 设备。这意味着:
当我以可视方式打开 GROUP_W 时, getChildView(...) 的 convertView 参数第一次正确地为 null 并稍后重用该视图。

此实现不适用于三星 Galaxy S3 和 Galaxy Tab。这意味着:当我以可视方式打开 GROUP_W 时,getChildView(...) 的 convertView 参数第一次不为空,并提供了错误的视图,从而进一步导致异常。

@Override
public int getChildType(int groupPosition, int childPosition) {
  switch (groupPosition) {
    case GROUP_W:
      return 0;
    case GROUP_X:
    case GROUP_Y:
      return 1;
    case GROUP_Z:
      return 2;
    default:
      // actually not used
      return super.getChildType(groupPosition, childPosition);
  }
}

@Override
public int getChildTypeCount() {
  return 3;
}

当我将实现更改为以下时,没有看到任何合乎逻辑的原因,那么它也适用于三星设备。

@Override
public int getChildType(int groupPosition, int childPosition) {
  switch (groupPosition) {
    case GROUP_W:
      return 1;
    case GROUP_X:
    case GROUP_Y:
      return 2;
    case GROUP_Z:
      return 3;
    default:
      return super.getChildType(groupPosition, childPosition);
  }
}

@Override
public int getChildTypeCount() {
  return 4;
}

是否有人也有这种奇怪的行为,或者有人了解我在做什么或出了什么问题?非常感谢 ;)

编辑:添加 getChildView()

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
  Context context = parent.getContext();
  switch (groupPosition) {
    case GROUP_W:
      X x = arrayX[childPosition];
      return ListItemFactory.getTwoLineListItemTextIndicatorTopRight(context, x.getString1(), x.getString2(), x.getString3(), convertView);
    case ...
    default:
      return null;
  }
}
public static View getTwoLineListItemTextIndicatorTopRight(Context context, CharSequence line1, CharSequence line2,
    CharSequence indicator, View convertView) {
  View view;
  if (convertView == null) {
    view = View.inflate(context, R.layout.two_line_list_item_textindicator_topright, null);
  }
  else {
    view = convertView;
  }

  // here happens a null pointer exception because textView1 is not available in the wrong convert view

  ((TextView) view.findViewById(R.id.textView1)).setText(line1);
  ((TextView) view.findViewById(R.id.textView2)).setText(line2);
  if (indicator == null || indicator == "") {
    ((TextView) view.findViewById(R.id.textViewIndicator)).setVisibility(View.GONE);
  }
  else {
    TextView textView = ((TextView) view.findViewById(R.id.textViewIndicator));
    textView.setText(indicator);
    textView.setVisibility(View.VISIBLE);
  }
  return view;
}
4

0 回答 0