我使用时为什么ListView行背景资源会发生变化?

时间:2013-03-13 13:14:48

标签: android listview background

我正在开发关于个人预算的Android应用程序。当我列出交易时,我使用的是ListView。在ListView我显示所有具有不同背景资源的收入,支出和转移交易。但是当我向下滚动到列表视图并再次出现时,背景图像会发生变化。有人可以告诉我其发生的原因吗?

这是我的代码示例;

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.transactionline, null);

    transaction.setType(Integer.parseInt(item.get("Type")));

    if(transaction.getType()==1){
        anaalan.setBackgroundResource(R.anim.greenbutton);
    }else if(transaction.getType()==3)
    {
        anaalan.setBackgroundResource(R.anim.buttonstyle);
    }

    return vi;
}

2 个答案:

答案 0 :(得分:0)

试试这个:

if (position % 2 == 1)
   { 
    convertView.setBackgroundColor(Color.WHITE);    
   }
 else
   { 
    convertView.setBackgroundColor(Color.TRANSPARENT); 
   }
convertView.setTag(holder);

答案 1 :(得分:0)

这是你问题的答案。

因为我们都知道ListView重用了converView并在重用视图中显示了新值。因此,无论何时向上或向下滚动ListView,从屏幕上消失的listItem都会重新使用刚出现在屏幕上的新listItem。

所以,当你将一些listItem的背景颜色添加到像绿色这样的东西时,当它从屏幕上消失并重新用于新的listItem时,它已经将它的背景颜色设置为绿色,所以新项目也会获得绿色背景和快速滚动列表上下最终所有项目变为绿色。

还有一件事总是给你的ListView固定高度,如fill_Parent或500dp之类的东西,因为当getView()开始绘制项目时,它将计算前三个列表项的大小,然后计算其余项目的大小,高度为列表视图。

所以我在这种情况下做的是,默认情况下我给每个视图一个透明的颜色,然后应用我的逻辑使其成为其他颜色。

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Holder holder;
        if (convertView == null){
            holder = new Holder();
            convertView =   View.inflate(context, R.layout.item, null);
            holder.txtID = (TextView) convertView.findViewById(R.id.text);
            holder.txtName  =   (TextView) convertView.findViewById(R.id.text2);
            convertView.setTag(holder);
        }else{
            holder = (Holder) convertView.getTag();
        }

        convertView.setBackgroundColor(Color.TRANSPARENT);

        if (Integer.parseInt( setter.get(position).getId() ) % 3 == 0  ){
            convertView.setBackgroundColor(Color.GREEN);
        }

        if (Integer.parseInt( setter.get(position).getId() ) % 2 == 0 ){
            convertView.setBackgroundColor(Color.YELLOW);
        }

        holder.txtID.setText(setter.get(position).getId());
        holder.txtName.setText(setter.get(position).getName());


        return convertView;
    }