我正在使用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对象中更改了一个私有字段,帮助我清除“来自”的项目,并突出显示项目“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函数但不是。
我希望选中的项目会被选为高位,并且没有必要滚动列表并再次返回以正确查看。
我确信必须有一个解决方案,有人对此有所了解吗?
答案 0 :(得分:1)
为什么不尝试使用
您的View上的invalidateViews()方法?