これは私のアダプターへのコードです:
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型に書き込めません。