以编程方式重绘 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的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式检查QAbstractItemModel / QTreeView中的项目
Chrome 在低 DPI 和高 DPI 显示器上以不同方式重绘 div