1

我正在开发有关个人预算的 android 应用程序。当我列出交易时,我正在使用ListView. 在ListViewI 上显示所有具有不同背景资源的收入、费用和转账交易。但是当我向下滚动到列表视图并再次出现时,背景图像会发生变化。有人能告诉我为什么会这样吗?

这是我的代码示例;

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

2 回答 2

0

这是您问题的答案。

众所周知,ListView 重用 converView 并在重用视图中显示新值。因此,每当您向上或向下滚动 ListView 时,从屏幕上消失的 listItems 都会与刚刚出现在屏幕上的新 listItems 一起重用。

因此,当您将背景颜色添加到具有绿色之类的某些列表项时,当它从屏幕上消失并重新用于新列表项时,它的背景颜色已经为绿色,因此新项目也将获得绿色背景,并且您滚动的速度也一样快向上和向下列出最终所有项目都变为绿色。

还有一件事总是给您的 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;
    }
于 2013-03-14T06:07:12.547 回答
0

尝试这个:

if (position % 2 == 1)
   { 
    convertView.setBackgroundColor(Color.WHITE);    
   }
 else
   { 
    convertView.setBackgroundColor(Color.TRANSPARENT); 
   }
convertView.setTag(holder);
于 2013-03-13T13:36:43.753 回答