以编程方式重绘 SlidingMenu

Posted

技术标签:

【中文标题】以编程方式重绘 SlidingMenu【英文标题】:Redrawing of SlidingMenu programmatically 【发布时间】:2014-08-05 18:55:27 【问题描述】:

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

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

我尝试了一些解决方案,例如销毁代表 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 对象中的一个私有字段,该字段帮助我清除“来自”我来的项目,并突出显示“我去”的项目。

此外,我在 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 并再次显示它而不滚动,突出显示的项目仍然是错误的。我也尝试过再次设置可见性(不可见)和可见性,但它也不起作用。我以为这样可能会调用 getChildView 函数,但事实并非如此。

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

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

【问题讨论】:

【参考方案1】:

你为什么不尝试使用

你的视图上的 invalidateViews() 方法?

【讨论】:

非常感谢,我在某些视图上尝试了 .invalidate,但没有成功。但是在 ExpandableListView 上的 invalidateViews() 它起作用了!

以上是关于以编程方式重绘 SlidingMenu的主要内容,如果未能解决你的问题,请参考以下文章

从 PaintCode 强制自定义 NSView 重绘

如何强制刷新/重绘 JScrollPane?

以编程方式检查QAbstractItemModel / QTreeView中的项目

Chrome 在低 DPI 和高 DPI 显示器上以不同方式重绘 div

WM_PAINT消息在窗口重绘的时候产生,那什么时候窗口会重绘(异步工作方式,效率更高,灵活性更强)

使用 Crossfilter 和 D3 重绘直方图