使用convertView的简单的VIewHolder模式实现错误

时间:2013-06-11 20:34:54

标签: android android-arrayadapter

我正在尝试使用convertView实现ViewHolder模式。两个问题:

1)当我评论第1行和第2行(模式所需的)时,一切正常。当if到位时,所有内容都会被扰乱,列表的第一个元素会显示两次(在列表的开头和结尾),并且在某些方向更改和列表滚动后,所有内容都会混乱。为什么会这样?

2)我正在使用ListActivity并为ArrayAdapter提供TextView和字符串数组(#3)但由于某种原因我还需要行(#4),否则列表项是空白的。这是因为我没有使用super.getView()?

class SushiAdapter extends ArrayAdapter<String> {

    private final Activity context;

    SushiAdapter(Activity context) {
        super(context, R.layout.row, R.id.label, MenuItems); // #3
        this.context = context;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
                View row = convertView;
                if (row == null) { //#1
                    LayoutInflater inflater = context.getLayoutInflater();
                    row = inflater.inflate(R.layout.row, parent, false);
                    ViewHolder holder = new ViewHolder();
                    holder.icon = (ImageView) row.findViewById(R.id.icon);
                    holder.position = position;
                    holder.item = (TextView) row.findViewById(R.id.label);
                    row.setTag(holder);
                } // #2
                ViewHolder newHolder = (ViewHolder) row.getTag();
                newHolder.item.setText(MenuItems[newHolder.position]); // #4
                newHolder.icon.setImageResource(R.drawable.sushi);
                return row;
    }           
}

1 个答案:

答案 0 :(得分:0)

如果要创建阵列适配器的新实例,例如:

ArrayAdapter<T> sushiAdapter = new ArrayAdapter<T>(context, R.layout.row, R.id.label, MenuItems)

此实例已经拥有了自己的 getView 方法实现。所以很明显,在你的情况下,当覆盖getView时,你自己提供完整的实现,并承担用内容填充视图的所有责任。 因此,如果您想添加新内容,请先调用 super.getView()

但在您的情况下,当您拥有图像+文本视图时,您需要扩展BaseAdapter并自行提供所有实现。 ArrayAdapter提供了简单的功能,扩展它并不常见。