4

在我的 Android 应用程序中,我有一个包含 5 个元素的 ListView。我创建了一个自定义适配器,以更改 listView 某些元素的背景。例如,列表视图的第二项还没有准备好,所以我想setBackground(Color.Gray),所以他可以看起来像没有完成它。为了做到这一点,我在我的自定义适配器中重写了来自 ArrayAdapter 的 getView() 方法,它是如何遵循的:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = super.getView(position, convertView, parent); 
    if(!itensAvailable[position]) v.setBackgroundColor(Color.Gray);
    return v;
}

奇怪的是,无论我使用布尔值itensAvailable[position]还是!itensAvailable[position]列表的第一个元素总是改变它的背景!列表中的所有其他元素的行为都与预期的一样,除了第一个。比这更奇怪,如果我这样做 if(position == 2) v.setBackgroundColor(Color.Gray);

它改变了位置 2 中的项目的背景,以及第一个项目!如果我做

if(position == 2) {
v.setBackgroundColor(Color.Gray);
System.out.println(v.getText());
}

更诡异!只有位置 2 的文本被打印,而不是第一个项目的文本。

到底是怎么回事?安卓漏洞?顺便说一句,我在 XOOM 3.2 Honeycomb 设备上对其进行了测试。

显然,如果我对此代码进行注释,则第一项不会改变它的背景。

4

3 回答 3

2

很奇怪!如果你写会发生什么:

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = super.getView(position, convertView, parent); 
        if(!itensAvailable[position]) v.setBackgroundColor(Color.Gray);
        else v.setBackgroundColor(Color.Transparent);
        return v;
    }
于 2011-11-25T13:50:38.493 回答
0

我无法解释奇怪的行为。你可以试试下面的代码,看看它是否能解决你的问题 -

@Override
 public View getView(int position, View convertView, ViewGroup parent) {
  if (convertView == null) {
     convertView = to the view to be displayed;
  }
  if(!itensAvailable[position]) convertView.setBackgroundColor(Color.Gray);
  return convertView;
 }
于 2011-11-25T14:00:51.770 回答
0

我有完全相同的问题。确实很奇怪!

对我有用的是删除线

View v = super.getView(position, convertView, parent); 

而是使用 -

LayoutInflater inflater = LayoutInflater.from(getContext());
View v = inflater.inflate(R.layout.__my__layout__, parent, false);
.... more view manipulations ....

希望能帮助到你!

于 2015-10-17T19:17:07.977 回答