自定义ListView适配器来更改某些项目

时间:2012-04-26 02:13:40

标签: android listview baseadapter

我为Android编写了一个自定义ListView适配器,用于更改数据的可视方面。当我加载ListView时,所需的项目的外观已更改。当我滚动视图时,其他项目将随机更改,直到最终列表中的每个项目都已修改其外观。

从我读过的关于这类代码的内容来看,我知道中的position字段 public View getView(int position, View convertView, ViewGroup parent)
因为Android重新使用旧视图,所以不一定映射到我的数据结构。这似乎是我努力工作的行为。

使用ViewHolder模式更新了getView方法,如Vincent建议的那样:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View rowView = convertView;
    if (rowView == null)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        rowView = inflater.inflate(R.layout.rowlayout, null);
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.text = (TextView) rowView.findViewById(R.id.tv01);
        rowView.setTag(viewHolder);
    }

    ViewHolder holder = (ViewHolder) rowView.getTag();
    String s = names[position];
    holder.text.setText(s);
    if (s.startsWith("a"))
    {
        holder.text.setTextColor(0xff00ffff);
    }

    return rowView;
}

我需要修改的项目是静态的,所以如果有更好的方法而不是在运行时更改它们,那也可以使用!非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

您的布局正在被android重用,这就是您获得此输出的原因。您需要做的是创建一个类,作为每个视图的静态视图,并将其用作标记。请参阅{ {3}}供参考

答案 1 :(得分:0)

您没有修改现有视图。如果convertView不为null,则意味着Android正在回收视图而不是对其进行充气,但您仍需要使用新值更新它。这样的事情会起作用:

public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;          

if(convertView == null) {
    convertView = mInflater.inflate(R.layout.rowlayout, null);
    holder = new ViewHolder();  
}
else {
    holder = (ViewHolder) convertView.getTag();
}
holder.title = (TextView) convertView.findViewById(R.id.tv01); 
convertView.setTag(holder);

return convertView;

}