我正在一个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方法)?我实现的理由是:所有返回的 View 都应该是相同的(这就是为什么我要调用super方法的原因),只有适合if条件的 View 才应更改。
谢谢你的帮助!
最佳答案
我做了一些研究,以找出应该如何正确进行。
我正在为有相同问题的其他人写下来,因为我猜这是正确的做法。请让我知道,如果我弄错了,或者此解决方案有我看不到的任何缺陷。
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
方法(基于getViewItemType
和getViewTypeCount
方法)的逻辑。关于android - getView中的自定义ArrayAdapter setBackground,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4008571/