0

これは私のアダプターへのコードです:

public class LogHistoryAdapter extends BaseAdapter {
private Context context = null;
private ArrayList<LogListItem> logList = null;

public LogHistoryAdapter(Context context) {
    this.context = context;
    logList = new ArrayList<LogHistoryAdapter.LogListItem>();

    LogListItem item1 = new LogListItem(Type.HEADER, "", "", "", "Wednesday, Jan 13 2012");
    logList.add(item1);
    LogListItem item2 = new LogListItem(Type.CLICKBLE, "ID ", "bla" , "Range 1m" , "");
    logList.add(item2);
    LogListItem item3 = new LogListItem(Type.CLICKBLE, "ID ", "bla" , "Range 1m" ,"");
    logList.add(item3);
    LogListItem item4 = new LogListItem(Type.CLICKBLE, "ID ", "bla" , "Range 1m", "" );
    logList.add(item4);
    LogListItem item5 = new LogListItem(Type.HEADER, "", "", "", "Tuesday, Jan 12 2012");
    logList.add(item5);
    LogListItem item6 = new LogListItem(Type.CLICKBLE, "ID ", "bla" , "Range 1m" , "");
    logList.add(item6);
    LogListItem item7 = new LogListItem(Type.CLICKBLE, "ID ", "bla" , "Range 1m" ,"");
    logList.add(item7);
    LogListItem item8 = new LogListItem(Type.CLICKBLE, "ID ", "bla" , "Range 1m" , "");
    logList.add(item8);
}

public enum Type {
    HEADER, CLICKBLE;
}

public class LogListItem {

    Type type;
    String name;
    String details;
    String id;
    String header;
    public LogListItem(Type type, String id, String name, String details, String header) {
        this.type = type;
        this.name = name;
        this.id = id;
        this.details = details;
        this.header = header;
    }


}

public int getCount() {
    return logList.size();
}

public Object getItem(int position) {
    return logList.get(position);
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View rowView, ViewGroup parent) {
    final SettingsViewHolder holder;
    LogListItem currentObj = logList.get(position);
    if (rowView == null) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = inflater.inflate(R.layout.row_settings_log, parent, false);
        holder = new SettingsViewHolder();

        switch (currentObj.type) {
        case HEADER:
            holder.layout = (RelativeLayout) rowView.findViewById(R.id.settingsItemLayoutLog);
            holder.text = (TextView) rowView.findViewById(R.id.settingsItemLog);
            break;
        case CLICKBLE:
            holder.layout = (RelativeLayout) rowView.findViewById(R.id.settingsSubitem1LayoutLog);
            holder.text = (TextView) rowView.findViewById(R.id.settingsSubItem1TxtViewLog);
            holder.text2 = (TextView) rowView.findViewById(R.id.settingsSubItem1TxtView2Log);
            holder.text3 = (TextView) rowView.findViewById(R.id.settingsSubItem1TxtView3Log);
            break;
        default:
            break;

        }
        rowView.setTag(holder);

    } else {
        holder = (SettingsViewHolder) rowView.getTag();
    }
    switch (currentObj.type) {
    case HEADER:
        LogService.log("header", "header: " + currentObj.header);
        LogService.log("header", "id: " + currentObj.id);
        LogService.log("header", "name: " + currentObj.name);
        LogService.log("header", "details: " + currentObj.details);
        LogService.log("=====", "===============================");
        holder.layout.setVisibility(View.VISIBLE);
        holder.text.setText(currentObj.header);
        break;

    case CLICKBLE:
        holder.layout.setVisibility(View.VISIBLE);
        LogService.log("clickable", "header: " + currentObj.header);
        LogService.log("clickable", "id: " + currentObj.id);
        LogService.log("clickable", "name: " + currentObj.name);
        LogService.log("clickable", "details: " + currentObj.details);
        LogService.log("clickable", "===============================");
        holder.text.setText(currentObj.id);
        //                holder.text2.setText(currentObj.name);
        //                holder.text3.setText(currentObj.details);

        break;
    default:
        break;
    }

    return rowView;
}

static class SettingsViewHolder {
    CheckBox checked;
    TextView text;
    TextView text2;
    TextView text3;
    RelativeLayout layout;

}
}

これで、このリストは Android 設定ページのリストに似たものになります。TextView (Type.HEADER) に日付のみを持つヘッダーがあり、次にボタン (Type.CLICKBLE) があります。問題は、リストを作成するときに、2 番目のヘッダー (「Tuesday, Jan 12 2012」) の後に、次のボタンである CLICKBLE (item6) が HEADER として作成され、次にアプリケーションがクラッシュすることです。 CLICKBLE タイプには TextView が 3 つあるのに対し、TextView は 1 つしかありません。そのため、Text を 2 番目の TextView に設定しようとするとクラッシュします (HEADER にあり、存在しません)。アダプターがリストを台無しにし、アイテムの種類も台無しにする理由を知る必要があります。現在このコードではANRエラーにはなりませんが、2番目と3番目のテキストをCLICKBLE型に書き込めません。

4

1 に答える 1

2

達成しようとするものについては、オーバーライドする必要もありますgetViewTypeCount() getItemViewType(int position)。呼び出して、使用するgetItemViewTypeビューの種類を選択しますgetViewgetViewTypeCount膨らませたい異なるビューの数を返す必要があります(あなたの場合は2つだと思います)。

public static final int NORMAL_ROW = 0;
public static final int DARKGRAY_ROW = 1;
@override
public int getViewTypeCount() {
      return 2;
}

@override
public int getItemViewType(int position) {
  LogListItem currentObj = logList.get(position);
  return (currentObj.type == HEADER) ? NORMAL_ROW :  DARKGRAY_ROW ;
}
于 2012-12-14T15:56:17.177 に答える