在getView中自定义ArrayAdapter setBackground

时间:2010-10-24 14:06:56

标签: android listview android-arrayadapter

我正在开发一个ListActivity,它会显示一堆数字(权重)。我想更改ListView中特定行的背景。为此,我创建了ArrayAdapter类的自定义实现,并重写了getView方法。适配器接受一个数字列表,并将数字20的背景设置为黄色(为简单起见)。

    public class WeightListAdapter extends ArrayAdapter<Integer> {

    private List<Integer> mWeights;

    public WeightListAdapter(Context context, List<Integer> objects) {
        super(context, android.R.layout.simple_list_item_1, objects);

        mWeights = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent);

        int itemWeight = mWeights.get(position);
        if (itemWeight == 20) {
            v.setBackgroundColor(Color.YELLOW);
        }
        return v;
    }

}

问题是,不仅数字20的行获得黄色背景,而且数字0的行(第一行),我不知道为什么会这样。

我在getView方法中做错了什么(比如调用super方法)?我的实现推理是:所有返回的视图应该是相同的(这就是我调用super方法的原因)只有符合if条件的视图才应该更改。

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

我做了一些研究,以了解如何正确地完成这项工作。

我正在为其他人写下同样的问题,因为我猜这是正确的方法。请让我知道,如果我弄错了,或者这个解决方案有什么缺点,我没有看到。

public class WeightListAdapter extends ArrayAdapter<Integer> {

  private static final int TYPE_COUNT = 2;
  private static final int TYPE_ITEM_COLORED = 1;
  private static final int TYPE_ITEM_NORMAL = 0;

  public WeightListAdapter(Context context, List<Integer> objects) {
    super(context, android.R.layout.simple_list_item_1, objects);
  }

  @Override
  public int getViewTypeCount() {
    return TYPE_COUNT;
  }

  @Override
  public int getItemViewType(int position) {
    int item = getItem(position);

    return (item == 30) ? TYPE_ITEM_COLORED : TYPE_ITEM_NORMAL;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View v = super.getView(position, convertView, parent);
    switch (getItemViewType(position)) {
    case TYPE_ITEM_COLORED:
      v.setBackgroundColor(Color.YELLOW);
      break;
    case TYPE_ITEM_NORMAL:
      break;
    }

    return v;

  }
}

显然,基类已经实现了逻辑,确保将convertView传递给getView方法(基于getViewItemTypegetViewTypeCount方法)。

答案 1 :(得分:1)

Android的视图是为每一行重用一个组件。我也遇到了这个问题。

答案 2 :(得分:1)

如果是因为重复使用,为什么不添加另一项检查,如果itemWeight不等于20?如果不相等,则将背景设置为正常。

相关问题