1

getChildType および getChildView メソッドもオーバーライドするBaseExpandableListAdapterの実装を作成しました。10 個のグループがあり、そのうち 4 個には子がいます。

次の実装、エミュレーターとテスト済みの htc デバイスで動作します。つまり
、GROUP_W を視覚的に開くと、getChildView(...) の convertView パラメータは最初は正しく null であり、後でビューを再利用します。

この実装は、Samsungs Galaxy S3 および Galaxy Tabでは機能しません。つまり、GROUP_W を視覚的に開くと、最初は getChildView(...) の convertView パラメータが null ではなく、間違ったビューが提供され、さらに例外が発生します。

@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;
}

実装を次のように変更すると、論理的な理由が見られずに、Samsung デバイスでも動作します。

@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