设置ListView的背景

SetBackground of ListView

我必须将特定 listView 项目的背景设置为灰色,前提是 isDelivered() 和 getPicked() 都应该为真。 对于打开 activity 时出现的前几个 listItems,背景设置正确,但是一旦我向下滚动,随机项目背景设置为灰色,不符合我的条件。

(我觉得是位置问题)但是我的自定义适配器 class 扩展了 ArrayAdapter 并且我的 logcat 上的位置也是正确的顺序 0,1,2,3...

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    if (convertView == null) {
        convertView = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.custaddress, parent, false);
    }

    final View rowView = convertView;

    tripPickUp = (Button) rowView.findViewById(R.id.picked);
    tripDelivered = (Button) rowView.findViewById(R.id.delivered);
    tripIsDelivered = (TextView) rowView.findViewById(R.id.isdelivered);

    if (tripsheet[position].getPicked() == false
            && tripsheet[position].isDelivered() == false) {
        tripPickUp.setVisibility(View.VISIBLE);
        tripDelivered.setVisibility(View.INVISIBLE);
        tripIsDelivered.setVisibility(View.INVISIBLE);
    }

    else if (tripsheet[position].isDelivered() == false
            && tripsheet[position].getPicked() == true) {
        tripPickUp.setVisibility(View.INVISIBLE);
        tripDelivered.setVisibility(View.VISIBLE);
        tripIsDelivered.setVisibility(View.INVISIBLE);

    } else {
        tripDelivered.setVisibility(View.INVISIBLE);
        tripIsDelivered.setVisibility(View.VISIBLE);
        tripPickUp.setVisibility(View.INVISIBLE);
        rowView.setBackgroundResource(R.color.gray);
    }

    return rowView;
}

基本上else语句就是执行的条件

这是因为适配器出于性能原因回收了视图。如果您确保始终设置背景,而不仅仅是当它应该是灰色的时候,您应该没问题。

换句话说,不要相信视图具有在 xml 中声明的初始状态,请确保明确设置任何项目在任何条件下都可能更改的所有颜色和其他属性。

GetView 重用视图。无论它处于什么状态(或颜色),它们可能与 xml.

中的不同

所以基本上您是将某些项目设置为灰色(当条件为真时),并且当它们被重复使用时,您不会将它们设置回白色。

这里有一些东西可以让你继续:

@Override
public View getView(int position, View convertView, ViewGroup parent) {


   // TODO Auto-generated method stub
    if (convertView == null) {
        convertView = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.custaddress, parent, false);
    }

final View rowView = convertView;

tripPickUp = (Button) rowView.findViewById(R.id.picked);
tripDelivered = (Button) rowView.findViewById(R.id.delivered);
tripIsDelivered = (TextView) rowView.findViewById(R.id.isdelivered);

if (tripsheet[position].getPicked() == false
        && tripsheet[position].isDelivered() == false) {
    tripPickUp.setVisibility(View.VISIBLE);
    tripDelivered.setVisibility(View.INVISIBLE);
    tripIsDelivered.setVisibility(View.INVISIBLE);
    rowView.setBackgroundResource(Color.WHITE);
}

else if (tripsheet[position].isDelivered() == false
        && tripsheet[position].getPicked() == true) {
    tripPickUp.setVisibility(View.INVISIBLE);
    tripDelivered.setVisibility(View.VISIBLE);
    tripIsDelivered.setVisibility(View.INVISIBLE);
    rowView.setBackgroundResource(Color.WHITE);

} else {
    tripDelivered.setVisibility(View.INVISIBLE);
    tripIsDelivered.setVisibility(View.VISIBLE);
    tripPickUp.setVisibility(View.INVISIBLE);
    rowView.setBackgroundResource(R.color.gray);
}

return rowView;
}

你可以尝试一件事: 删除:final View rowView = convertView;

而不是 return rowView 只是 return convertView

并替换这个

rowView.setBackgroundResource(R.color.gray);

来自

convertView.setBackgroundResource(R.color.gray);

我也遇到了这个问题。我认为使 rowView 成为最终版本会产生问题。