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 项),第二次点击是从顶部计算,从底部计算第三次等。但是这是唯一的反应线这种方式(position选择顶部项目时始终等于 0) 每次多次按下同一个项目时也会执行此行(没有别的??),更改在上述模式之后显示背景的项目。这应该通过if(oldPs != position)

(图片中的问题描述)

所以:

1.为什么会这样?

2.我怎样才能使它适用于android 2.x?

4

1 回答 1

0

ListView出于效率原因,A添加和删除其子代。滚动时,列表中的不可见视图将被删除,并创建新的可见视图(或从不可见视图中回收)。子顺序可能不反映列表顺序。

做你想做的事,创建你自己的ListAdapter,例如通过扩展ArrayAdapter类和覆盖getView()。此方法获取一个参数,该参数position是您想要的位置。您可以调用超级方法来检索视图,修改背景并返回它。

于 2013-07-02T14:23:15.790 回答