3

我有一个 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>

我将选择器设置为适配器中的可绘制对象,如下所示:

@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));
}
4

2 回答 2

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 解决方案将组指示器定位在我想要的位置,我能够获得我想要的相同效果

以这种方式定位组指示器并没有证明对我来说是最佳解决方案,因为我在某些手机上看到了不同的结果,但这本身就是一个不同的帖子。

于 2013-11-01T19:02:58.053 回答
0

遇到同样的问题,我需要一些可靠的东西来完全符合我对 state_expanded 标志(以及可选的 state_last 项目标志)的期望,例如将组的背景扩展到其子项。

我最终做了这样的事情,让我可以为所有 ExpandableListView 重用它:

这个想法是从这个适配器类派生并实现它定义的 2 个抽象方法(而不是原始方法)。然后你必须为每个状态创建 4 个背景(我个人使用了形状,但我相信 9-patches 在这里也会做得很好)。

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;
}
}
于 2015-10-03T18:28:35.883 回答