1

リスト内の各アイテムに異なる背景を使用することになっているナビゲーションドロワーに取り組んでいます。したがって、次のコード (onClick) を使用しています。

private class NavBarClickHandler implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView parent, View view, int position,
            long id) {
        selectItem(position);
    }
}

private void selectItem(int position) {
    if(oldPos != position)
    {
        oldPos = position;
        cont.removeAllViews();
        for(int i = 0; i < leftBar.getChildCount(); i++)
            leftBar.getChildAt(i).setBackgroundColor(Color.parseColor("#111111"));
        setTitle(leftBarEntries[position]);
        leftBar.getChildAt(position).setBackgroundColor(Color.parseColor(colorArray[position%colorArray.length]));
        actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor(colorArray[position%colorArray.length])));

        switch (position) {
        case 0:
            cont.addView(LI.inflate(R.layout.hem, cont, false));
            break;

        case 1:
            cont.addView(LI.inflate(R.layout.hem, cont, false));
            break;

        case 2:
            cont.addView(LI.inflate(R.layout.kalender, cont, false));
            break;

        case 3:
            cont.addView(LI.inflate(R.layout.kalender, cont, false));
            break;

        }
    }
    whole.closeDrawer(leftBar);
}

これは正常に動作します... Android 3.0以降。ただし、Android 2.x ベースのエミュレーターでコードを実行すると、その部分は

leftBar.getChildAt(position).setBackgroundColor(Color.parseColor(colorArray[position%colorArray.length]));

正しい背景色を設定しますが、間違った項目に設定します。

私のテストでは、最初のクリックで getChild が下から計算され (つまり、一番上の項目は項目 3 で、一番下の項目は項目 0 です)、2 番目のクリックは上から計算され、3 番目は下から計算されます。ただし、これは反応する唯一の行です。このように (position一番上の項目が選択されている場合は常に 0 に等しい) この行 (他に何もない??) は、同じ項目を複数回押すたびに実行され、上記のパターンの後に背景を表示する項目を変更します。これは、if(oldPs != position)

(画像の問題の説明)

したがって:

1.どうしてこうなった?

2.Android 2.xでこれを機能させるにはどうすればよいですか?

4

1 に答える 1

0

AListViewは、効率上の理由から、その子を追加および削除します。スクロールすると、リスト内の非表示のビューが削除され、新しく表示されるビューが作成されます (または非表示のビューからリサイクルされます)。子の順序は、リストの順序を反映していない場合があります。

ListAdapter必要なことを行うには、クラスを拡張してArrayAdapterをオーバーライドするなどして、独自の を作成しますgetView()。このメソッドは、position必要な位置であるパラメーターを取得します。スーパーメソッドを呼び出してビューを取得し、背景を変更して返すことができます。

于 2013-07-02T14:23:15.790 に答える