配列からカスタムアダプタを介して入力されるリストビューでさまざまなテンプレートを使用しています。リストビューの位置に応じて、別のテンプレートが使用されているリストにアイテムを追加しています。
メソッドが正しいビューIDを返さないため、関連する2つの問題があります。
adapter.notifyDataSetChanged();を使用する場合 textviewsのテキストは適応されませんが、表示されている画面の外側の行も設定/適応されません。次の方法を使用してビューIDを取得します。
TextView getText() {
if (title == null) {
switch (templateId) {
case ListViewAdapter.TPL_TITLE:
title = (TextView) row.findViewById(R.id.titletitle);
break;
case ListViewAdapter.TPL_PAYMENT:
title = (TextView) row.findViewById(R.id.titlepayment);
break;
}
}
return (title);
}
私のアクティビティでは、さまざまなListItem(別のクラス)があります。
items.add(new ListItem(id, title, description, amount, date, template));
私はリストに記入します:
adapter = new ListViewAdapter(this, items);
mainMenu = (ListView) findViewById(R.id.listview);
mainMenu.setAdapter(adapter);
私はこのgetViewメソッドを持っています:
public View getView(int position, View convertView, ViewGroup parent) {
templateId=getTemplateID(items.get(position).getType());
View row = convertView;
ListViewWrapper wrapper = null;
if (row == null) {
LayoutInflater inflater = activity.getLayoutInflater();
row = inflater.inflate(R.layout.listviewtemplates, null);
wrapper = new ListViewWrapper(row);
row.setTag(wrapper);
} else {
wrapper = (ListViewWrapper) row.getTag();
}
wrapper.setTemplateId(templateId);
wrapper.populateFrom(items.get(position));
return (row);
}
ラッパー内:
public void populateFrom(ListItem r) {
getText().setText(r.getTitle());
if (templateId == ListViewAdapter.TPL_TITLE) {
}
if (templateId == ListViewAdapter.TPL_PAYMENT) {
getSubtext().setText(r.getDescription());
getAmount().setText(r.getAmount());
getDate().setText(r.getDate());
} }
setTemplate();
}
うまくいけば、これは読みやすく、誰もが私の問題を理解/認識していますか。本当の問題は、行ごとに正しいViewIDを返すにはどうすればよいかということだと思います。