您好我发现了一个我无法理解的奇怪问题。希望有人可以帮助我:
如果屏幕上显示所有视图,我的列表看起来很棒。一旦屏幕较小(或列表较长),有时条目的视图与应有的视图不同。可以通过向上或向下滚动来限制此问题,以便条目离开窗口。
我有一个listview,其中包含不同的入口类型,它们具有不同的布局文件。这是决定将显示哪种布局的方法:
public View getView(int position, View view, ViewGroup parent) {
NavigationListEntry i = entries.get(position);
View v = view;
if (v == null)
switch(i.Type) {
case ACTIVE_ENTRY:
v = inflater.inflate(R.layout.list_nav_row_active, null);
break;
case HEADER:
v = inflater.inflate(R.layout.list_nav_row_header, null);
break;
...
default:
v = inflater.inflate(R.layout.list_nav_row_active, null);
break;
}
}
你有什么想法可能会发生这种情况吗?
/编辑 如果我只删除“if(v == null)”
,它似乎有效答案 0 :(得分:1)
您在此处遇到问题,您参与的回收View
可能与您要返回的Type
不同。假设v是A类型,它不是null,你发布的代码没有说明这一点。
答案 1 :(得分:1)
如果您删除if(v==null)
,则不会重复使用已被夸大的观看次数。如果你这样做,列表视图将有点迟缓。
最好的方法是
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
NavigationListEntry i = getItem(position);
if(null == convertView){
convertView = inflateNewView(i.type);
holder = (ViewHolder) convertView.getTag();
} else{
//getting tag to obtain the already found views
holder = (ViewHolder) convertView.getTag();
if(holder.type != i.type){
convertView = inflateNewView(i.type);
holder = (ViewHolder) convertView.getTag();
}
}
//always update the elements
holder.title.setText(i.getTitle());
holder.desc.setText(i.getDesc());
holder.content.setText(i.getContent());
return convertView;
}
/**
* Inflates a new view for the specified type
* @return the newly inflated view
*/
private View inflateNewView(int type){
View convertView = null;
switch(type) {
case ACTIVE_ENTRY:
convertView = inflater.inflate(R.layout.list_nav_row_active, null);
break;
case HEADER:
convertView = inflater.inflate(R.layout.list_nav_row_header, null);
break;
...
default:
convertView = inflater.inflate(R.layout.list_nav_row_active, null);
break;
}
holder = new ViewHolder();
convertView = inflater.inflate(LAYOUT_RESOURCE, null);
holder.title = (TextView) convertView.findViewById(R.id.txtTitle);
holder.desc = (TextView) convertView.findViewById(R.id.txtDesc);
holder.content = (TextView) convertView.findViewById(R.id.txtContent);
holder.type = type;
//setting tag to reduce hierarchy lookup
convertView.setTag(holder);
return convertView;
}
/**
* Holder class to improve performance. Helps in reducing view hierarchy lookup
*/
private static class ViewHolder {
TextView title;
TextView desc;
TextView content;
int type;
}
这是至少尝试回收您的观点的最佳方法。 希望这有帮助
答案 2 :(得分:-1)
在滚动或更新视图时,位置可能会发生变化。 建议使用数组而不是位置