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 に答える