ExpandableListView更改drawable state_expanded

时间:2017-03-13 09:59:24

标签: android expandablelistview android-drawable expandablelistadapter

我的ExpandableListAdapter出了问题。我使用自定义图像作为indicator,因为我想将它定位在菜单项的右侧而不是左侧。我还需要在某些项目上隐藏indicator

我的drawable看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:state_expanded="true"
    android:drawable="@drawable/arrow_up" />
<item
    android:drawable="@drawable/arrow_down" />
</selector>

所以我使用了state_expanded的{​​{1}}。

我的Android中包含DrawerLayout

LinearLayout

我手动隐藏普通<LinearLayout android:id="@+id/drawer_linear_layout" android:layout_width="@dimen/menu_width" android:layout_height="match_parent" android:layout_gravity="start" android:orientation="vertical"> <ExpandableListView android:id="@+id/navigationmenu" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:layout_marginTop="@dimen/nav_header_height" android:childDivider="@android:color/transparent" android:headerDividersEnabled="true" android:groupIndicator="@android:color/transparent" android:background="@drawable/border_shadow"> </ExpandableListView> </LinearLayout> ,以便稍后在代码中添加自定义groupIndicator

我的Drawable似乎是正确的:

ExpandableListAdapter

问题是public class ExpandableListAdapter extends BaseExpandableListAdapter { ... private static final int[] EMPTY_STATE_SET = {}; private static final int[] GROUP_EXPANDED_STATE_SET = { android.R.attr.state_expanded }; private static final int[][] GROUP_STATE_SETS = { EMPTY_STATE_SET, // 0 GROUP_EXPANDED_STATE_SET //1 }; ... @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { MOMenuItem headerTitle = (MOMenuItem) getGroup(groupPosition); LayoutInflater infalInflater = (LayoutInflater) this.mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout linLayout = (LinearLayout) infalInflater.inflate(R.layout.list_header, parent, false); convertView = linLayout; View indicator = convertView.findViewById(R.id.indicator_image); if (groupPosition == 1) { Log.d("GetGroupView", "Called!"); } if (indicator != null) { ImageView indicatorImage = (ImageView) indicator; if (getChildrenCount(groupPosition) == 0) { indicatorImage.setVisibility(View.INVISIBLE); } else { if (groupPosition == 1) { Log.d("IsExpanded is", "" + isExpanded); } indicatorImage.setVisibility(View.VISIBLE); int stateSetIndex = (isExpanded ? 1 : 0); if (groupPosition == 1) { Log.d("State Index", "" + stateSetIndex); } Drawable drawable = indicatorImage.getDrawable(); drawable.setState(GROUP_STATE_SETS[stateSetIndex]); } } ... return convertView; } } 没有更新。但是,indicator - 索引1处项目的语句的输出在打开时为:

  1. GetGroupView:Called!
  2. IsExpanded是:true
  3. 州指数:1
  4. Log保持不变。

2 个答案:

答案 0 :(得分:1)

经过长时间的研究和反复试验后,我没有办法让它与州合作。但是,我使用的图像本身如下:

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    MOMenuItem headerTitle = (MOMenuItem) getGroup(groupPosition);

    LayoutInflater infalInflater = (LayoutInflater) this.mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    LinearLayout linLayout = (LinearLayout) infalInflater.inflate(R.layout.list_header, parent, false);
    convertView = linLayout;

    View indicator = convertView.findViewById(R.id.indicator_image);

    if (indicator != null) {
        ImageView indicatorImage = (ImageView) indicator;
        if (getChildrenCount(groupPosition) == 0) {
            indicatorImage.setVisibility(View.INVISIBLE);
        } else {
            indicatorImage.setVisibility(View.VISIBLE);

            if (isExpanded) {
                indicatorImage.setImageResource(R.drawable.arrow_up);
            } else {
                indicatorImage.setImageResource(R.drawable.arrow_down);
            }
        }
    }

    ...
}
可悲的是,具有可绘制和状态的清洁解决方案无法正常工作。我希望这会帮助其他人绊倒这个问题。

答案 1 :(得分:0)

遵循此https://stackoverflow.com/a/57369511/6117565,然后在您的模型中以编程方式将图标添加到特定列表项。