调整行大小时,ListFragment中行的替代背景不起作用

时间:2012-09-29 02:57:29

标签: background resize android-arrayadapter android-listfragment alternate

我正在使用自定义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));
}

2 个答案:

答案 0 :(得分:1)

用于组成列表的视图会在屏幕上显示后重复使用。

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

答案 1 :(得分: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;
}

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