0

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

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

我有一个列表视图,其中包含不同的条目类型,具有不同的布局文件。这是应该决定将显示什么布局的方法:

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;
            }
}

你知道为什么会发生这种情况吗?

/edit 如果我只删除“if (v == null)”,它似乎可以工作

4

3 回答 3

1

您在这里遇到问题,View您在参数中获得的回收可能与Type您想要返回的不同。假设 v 属于 A 类型,并且它不为空,您发布的代码对此没有任何说明。

于 2012-11-28T12:43:31.617 回答
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;

}   

这是至少尝试回收您的观点的最佳方式。希望这可以帮助

于 2012-11-28T14:15:26.457 回答
-1

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

于 2012-11-28T12:44:43.503 回答