滚动时ListView条目正在更改其布局

时间:2012-11-28 12:35:36

标签: java android android-layout

您好我发现了一个我无法理解的奇怪问题。希望有人可以帮助我:

如果屏幕上显示所有视图,我的列表看起来很棒。一旦屏幕较小(或列表较长),有时条目的视图与应有的视图不同。可以通过向上或向下滚动来限制此问题,以便条目离开窗口。

我有一个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)”

,它似乎有效

3 个答案:

答案 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)

在滚动或更新视图时,位置可能会发生变化。 建议使用数组而不是位置