以编程方式重绘SlidingMenu

时间:2014-06-16 00:46:27

标签: android layout expandablelistadapter

我正在使用Jeremy Feinstein的SlidingMenu成功。在幻灯片菜单中,我创建了一个项目列表,如下图所示。

enter image description here

我已经设法让它正常工作,直到现在我已经决定在所选项目的左侧添加一个指示器(一个矩形的颜色),这给了我一些麻烦。

我尝试了一些解决方案,比如销毁代表SlideMenu的RelativeLayout,但在某些情况下有超过200个项目,并且重新创建它是非常耗时的。

其他不起作用的解决方案是获取与项目关联的视图,并以编程方式更改背景颜色。这里的问题是当有超过12个项目时(我的屏幕显示最大值)。在这种情况下,如果我尝试更改第15项的颜色(即),我会得到NullPointerException。

最终我成功地做到了:

private void updateSlideViewIndicator(int id_from, int id_to) {
    SectionItem si = (SectionItem) slidePreguntas.getSectionListAdapter().getChild(0, id_from);
    si.setActualItem(false);
    si = (SectionItem) slidePreguntas.getSectionListAdapter().getChild(0, id_to);
    si.setActualItem(true);
}

使用此代码,我在Item对象中更改了一个私有字段,帮助我清除“来自”的项目,并突出显示项目“to”我要去。

此外,我在SectionListAdapter.java的getChildView中查看该字段:

@Override
public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.pregunta_slide_menu_sectionitem,
                parent, false);
    }

    SectionItem oSectionItem = this.sections.get(groupPosition).getSectionItems().get(childPosition);

    TextView titleView = (TextView) convertView
            .findViewById(R.id.slidingmenu_sectionitem_label);
    titleView.setText(oSectionItem.getTitle());

    TextView textView = (TextView) convertView
            .findViewById(R.id.slidingmenu_sectionitem_text);
    textView.setText(oSectionItem.getText());

    View indicator = (View) convertView
            .findViewById(R.id.slidingmenu_sectionitem_indicator);

    if (oSectionItem.isActualItem()) {
        indicator.setBackgroundColor(this.context.getResources()
                .getColor(R.color.marca));
    } else {
        indicator.setBackgroundColor(this.context.getResources()
                .getColor(R.color.blanco));
    }

    return convertView;
}

此解决方案的问题在于,仅当我将slideMenu滚动到所选项目的可见性之外并将其返回时,才会更新绿色指示器。只要我隐藏slideMenu并再次显示它而不滚动,高亮显示的项目仍然是错误的。我也尝试过setVisibility(Invisible)和Visible,但它也没有用。我想也许这样就可以调用getChildView函数但不是。

我希望选中的项目会被选为高位,并且没有必要滚动列表并再次返回以正确查看。

我确信必须有一个解决方案,有人对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

为什么不尝试使用

您的View上的invalidateViews()方法?