【问题标题】:Custom ArrayAdapter setBackground in getViewgetView 中的自定义 ArrayAdapter setBackground
【发布时间】:2010-10-24 14:06:55
【问题描述】:

我正在开发一个 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 条件的视图应该被更改。

感谢您的帮助!

【问题讨论】:

    标签: android listview android-arrayadapter


    【解决方案1】:

    我进行了一些研究,以找出应该如何正确执行此操作。

    我正在为其他有同样问题的人写下这篇文章,因为我想这是正确的方法。请让我知道,如果我弄错了或者这个解决方案有任何我没有看到的缺陷。

    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 方法)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我明白了。这是有道理的,是的。所以现在的问题是解决这个问题的最佳方法是什么。放弃 convertView 或为两者设置样式属性,如果结束,则选项?
      【解决方案3】:

      如果是由于重用,为什么不添加另一个检查 itemWeight 是否不等于 20?如果不相等,则将背景恢复正常。

      【讨论】:

      • 是的,我想过,但我做了一些研究,找到了另一种解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多