我在通过自定义适配器从数组填充的列表视图中使用不同的模板。我将项目添加到列表“项目”中,具体取决于列表视图中的位置,使用不同的模板。
我有两个相关的问题,因为我的方法没有返回正确的视图 ID:
如果我使用 adapter.notifyDataSetChanged(); textviews 中的文本未调整,可见屏幕之外的行也未设置/调整。我使用以下方法获取 View 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);
}
在我的活动中,我有不同的 ListItems(一个单独的类):
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?