0

我正在使用自定义 ListFragment 来显示一个列表,其中偶数行有背景,奇数行没有。为此,我使用重写的 getView(int, View, ViewGroup) 方法创建了 ArrayAdapter 的子类,并在那里为偶数行设置了背景资源。

它起作用了,但是我需要将视图的尺寸调整为在有和没有背景的行中相等,所以我调整了 LayoutParams 如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    if ((position & 1) == 0) {
        view.setBackgroundResource(R.drawable.marcador_wink_normal);
    }
    ViewGroup.LayoutParams params = view.getLayoutParams();
    params.height = rowHeight;
    view.setLayoutParams(params);
    return view;
}

我试过这个,它似乎工作,直到我向下滚动然后向上滚动,这导致背景被应用到每一行。

我的问题是:我做错了什么?

我正在使用片段的 v4 支持库,这是我的自定义 ListFragment 的 onCreate(Bundle) 方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
            android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;

    setListAdapter(new WinkAdapter(getActivity(), layout, TEST_LIST));
}
4

2 回答 2

1

用于组成列表的视图一旦在屏幕上不可见就会被重用。

在您的原始代码中,一旦在给定视图上将背景设置为 R.drawable.marcador_wink_normal,它就永远是 R.drawable.marcador_wink_normal。当您添加 else 时,您使其在这些重用视图上正确设置了背景。

于 2013-03-27T02:20:44.587 回答
0

好的,我解决了它只是添加了一个else语句:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    if ((position & 1) == 0) {
        view.setBackgroundResource(R.drawable.marcador_wink_normal);
    }
    else {
        view.setBackgroundColor(0);
    }
    ViewGroup.LayoutParams params = view.getLayoutParams();
    params.height = 100;
    view.setLayoutParams(params);
    return view;
}

但我仍然不明白为什么会出现问题。

于 2012-09-29T22:38:16.893 回答