我有一个ExpandableListView,我希望在展开项目时使用不同的视图进行自定义。问题是我从未显示我分配给state_expanded属性的图像。我已经尝试了几乎所有其他属性的状态,但唯一一个做任何事情的是state_pressed,它只是在按下状态时简要显示不同的图像。当项目展开时,如何让list_item_expanded drawable保持显示状态?任何想法或帮助将不胜感激。
这是我的选择器。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/list_item_expanded" android:state_expanded="true"></item>
<item android:drawable="@drawable/list_item"></item>
</selector>
这是我设置ExpandableListView
的样式<style name="customExpandableList" parent="@android:style/Widget.ExpandableListView">
<item name="android:groupIndicator">@null</item>
<item name="android:dividerHeight">5dp</item>
<item name="android:divider">@android:color/transparent</item>
<item name="android:listSelector">@android:color/transparent</item>
<item name="android:cacheColorHint">@android:color/transparent</item>
<item name="android:childDivider">@android:color/transparent</item>
</style>
我将选择器设置为适配器中的drawable,如下所示:
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View view, ViewGroup parent) {
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.trans_sum_row, null);
}
view.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.list_item_selector));
}
答案 0 :(得分:1)
似乎没有办法做我想做的事情。 android:state_expanded
属性仅适用于组指示符,而不适用于ExpandableListView本身。我最终做的是为ELV创建一个选择器,为组指示器创建另一个选择器,如此
<style name="customExpandableList" parent="@android:style/Widget.ExpandableListView">
<item name="android:groupIndicator">@drawable/custom_group_selector</item>
<item name="android:background">@drawable/custom_elv_selector</item>
<item name="android:dividerHeight">5dp</item>
<item name="android:divider">@android:color/transparent</item>
<item name="android:listSelector">@android:color/transparent</item>
<item name="android:cacheColorHint">@android:color/transparent</item>
<item name="android:childDivider">@android:color/transparent</item>
</style>
之后,我通过使用SO解决方案here.
将群组指标定位到我想要的位置,从而获得了我想要的效果。以这种方式定位群组指示器对我来说并不是最佳解决方案,因为我在某些手机上看到了不同的结果,但这本身就是一个不同的帖子。
答案 1 :(得分:0)
遇到同样的问题,我需要一些可靠的东西,完全符合我对state_expanded标志的预期(以及可选的项目的state_last标志),例如将组的背景扩展到其子代。
我最终做了类似这样的事情,允许我重用所有ExpandableListView:
这个想法是从这个适配器类派生并实现它定义的2抽象方法(而不是原始)。然后你必须为每个州创建4个背景(我个人使用的是形状,但我确信9个补丁在这里也会做得很好)。
group_padding用于确保组视图不在左侧指示符的顶部。
public abstract class ccc71_expandable_list_adapter extends BaseExpandableListAdapter
{
protected Context context;
private int group_padding;
protected abstract View getChildView(int groupPosition, int childPosition, View convertView);
protected abstract View getGroupView(int groupPosition, View convertView, View parent);
public ccc71_expandable_list_adapter(Context ctx)
{
super();
context = ctx.getApplicationContext();
TypedArray ta = context.getTheme().obtainStyledAttributes(new int[] { android.R.attr.expandableListPreferredItemPaddingLeft });
group_padding = (int) ta.getDimension(0, 10f);
ta.recycle();
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
{
View v = getGroupView(groupPosition, convertView, parent);
if (isExpanded)
{
v.setBackgroundResource(R.drawable.drop_shadow_expanded);
}
else
{
v.setBackgroundResource(R.drawable.drop_shadow_collapsed);
}
v.setPadding(group_padding, v.getPaddingTop(), v.getPaddingRight(), v.getPaddingBottom());
return v;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
{
View v = getChildView(groupPosition, childPosition, convertView);
if (isLastChild)
{
v.setBackgroundResource(R.drawable.drop_shadow_child_last);
}
else
{
v.setBackgroundResource(R.drawable.drop_shadow_childs);
}
return v;
}
}