ExpandableListView
に、子のないグループのグループインジケーターを非表示にする方法はありますか?
これを試してください>>>
すべてのアイテム
getExpandableListView().setGroupIndicator(null);
Xmlで
Android:groupIndicator="@null"
Android:groupIndicator
プロパティは、状態が有効なドロウアブルを取ります。つまり、状態ごとに異なる画像を設定できます。
グループに子がない場合、対応する状態は「state_empty」です
これらの参照リンクを参照してください。
state_empty
については、混乱しない別の画像を設定するか、単に透明色を使用して何も表示しないようにすることができます.
このアイテムを他のステートフルドロアブルに追加します。
<item Android:state_empty="true" Android:drawable="@Android:color/transparent"/>
したがって、ステートリストは次のようになります。
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_empty="true" Android:drawable="@Android:color/transparent"/>
<item Android:state_expanded="true" Android:drawable="@drawable/my_icon_max" />
<item Android:drawable="@drawable/my_icon_min" />
</selector>
ExpandableListActivityを使用している場合は、onCreateで次のようにgroupindicatorを設定できます。
getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.my_group_statelist));
これが機能することをテストしました。
StrayPointerの回答とブログのコードに基づいて、コードをさらに簡素化できます。
Xmlで、以下をExpandableListViewに追加します。
Android:groupIndicator="@Android:color/transparent"
次に、アダプターで以下を実行します。
@Override
protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean){
**...**
if ( getChildrenCount( groupPosition ) == 0 ) {
indicator.setVisibility( View.INVISIBLE );
} else {
indicator.setVisibility( View.VISIBLE );
indicator.setImageResource( isExpanded ? R.drawable.list_group_expanded : R.drawable.list_group_closed );
}
}
SetImageResourceメソッドを使用することにより、ワンライナーですべてを完了できます。アダプタに3つの整数配列は必要ありません。また、展開された状態と折りたたまれた状態のXMLセレクターも必要ありません。すべてはJavaを介して行われます。
さらに、このアプローチでは、デフォルトでグループが展開されたときに、ブログのコードで機能しないものが正しいインジケーターを表示します。
別の回答で述べたように、Androidは展開されていないリストグループを空として扱うため、グループに子が含まれていてもアイコンは描画されません。
このリンクは私のために問題を解決しました: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html
基本的に、デフォルトのドロアブルを透明に設定し、そのドロアブルをImageViewとしてグループビューに移動し、アダプター内の画像を切り替える必要があります。
あなたのコードでは、グループリストにカスタムXMLを使用し、その中にImageViewforGroupIndicator。
そして、以下に配列を追加しますExpandableListAdapter
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
};
ExpandableListAdapterのメソッドでも、以下と同じものを追加します
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
{
if (convertView == null)
{
LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.row_group_list, null);
}
//Image view which you put in row_group_list.xml
View ind = convertView.findViewById(R.id.iv_navigation);
if (ind != null)
{
ImageView indicator = (ImageView) ind;
if (getChildrenCount(groupPosition) == 0)
{
indicator.setVisibility(View.INVISIBLE);
}
else
{
indicator.setVisibility(View.VISIBLE);
int stateSetIndex = (isExpanded ? 1 : 0);
Drawable drawable = indicator.getDrawable();
drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
}
}
return convertView;
}
リファレンス:http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups。 html
これはXMLからの別の方法で、Android:groupIndicator="@null"
を設定できます
XMLで
Android:groupIndicator="@null"
In ExpandableListAdapter
-> getGroupView
In次のコードをコピー
if (this.mListDataChild.get(this.mListDataHeader.get(groupPosition)).size() > 0){
if (isExpanded) {
arrowicon.setImageResource(R.drawable.group_up);
} else {
arrowicon.setImageResource(R.drawable.group_down);
}
}
私の解決策を提案する:
1)デフォルトのgroupIndicatorをクリアします。
<ExpandableListView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="wrap_content"
Android:layout_height="240dp"
Android:layout_gravity="start"
Android:background="#cccc"
Android:groupIndicator="@Android:color/transparent"
Android:choiceMode="singleChoice"
Android:divider="@Android:color/transparent"
Android:dividerHeight="0dp"
/>
2)ExpandableAdapterの場合:
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = new TextView(context);
}
((TextView) convertView).setText(groupItem.get(groupPosition));
((TextView) convertView).setHeight(groupHeight);
((TextView) convertView).setTextSize(groupTextSize);
//create groupIndicator using TextView drawable
if (getChildrenCount(groupPosition)>0) {
Drawable zzz ;
if (isExpanded) {
zzz = context.getResources().getDrawable(R.drawable.arrowup);
} else {
zzz = context.getResources().getDrawable(R.drawable.arrowdown);
}
zzz.setBounds(0, 0, groupHeight, groupHeight);
((TextView) convertView).setCompoundDrawables(null, null,zzz, null);
}
convertView.setTag(groupItem.get(groupPosition));
return convertView;
}
単純に、非表示のグループヘッダーにheight = 0の新しいxmlレイアウトを作成します。たとえば、「group_list_item_empty.xml」です
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="0dp">
</RelativeLayout>
通常のグループヘッダーレイアウトは「your_group_list_item_file.xml」です
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="48dp"
Android:orientation="horizontal">
...your xml layout define...
</LinearLayout>
最後に、アダプタークラスのgetGroupViewメソッドを更新します。
public class MyExpandableListAdapter extends BaseExpandableListAdapter{
//Your code here ...
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup viewGroup) {
if (Your condition to hide the group header){
if (convertView == null || convertView instanceof LinearLayout) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.group_list_item_empty, null);
}
return convertView;
}else{
if (convertView == null || convertView instanceof RelativeLayout) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.your_group_list_item_file, null);
}
//Your code here ...
return convertView;
}
}
}
IMPORTANT:レイアウトファイルのルートタグ(非表示と通常)は異なる必要があります(上記の例のように、LinearLayoutとRelativeLayout)
これを使用して、それは私のために完全に働いています。
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/group_indicator_expanded" Android:state_empty="false" Android:state_expanded="true"/>
<item Android:drawable="@drawable/group_indicator" Android:state_empty="true"/>
<item Android:drawable="@drawable/group_indicator"/>
</selector>
Mihir Trivediの答えを改善したかっただけです。これをMyExpandableListAdapterクラス内のgetGroupView()内に配置できます
View ind = convertView.findViewById(R.id.group_indicator);
View ind2 = convertView.findViewById(R.id.group_indicator2);
if (ind != null)
{
ImageView indicator = (ImageView) ind;
if (getChildrenCount(groupPosition) == 0)
{
indicator.setVisibility(View.INVISIBLE);
}
else
{
indicator.setVisibility(View.VISIBLE);
int stateSetIndex = (isExpanded ? 1 : 0);
/*toggles down button to change upwards when list has expanded*/
if(stateSetIndex == 1){
ind.setVisibility(View.INVISIBLE);
ind2.setVisibility(View.VISIBLE);
Drawable drawable = indicator.getDrawable();
drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
}
else if(stateSetIndex == 0){
ind.setVisibility(View.VISIBLE);
ind2.setVisibility(View.INVISIBLE);
Drawable drawable = indicator.getDrawable();
drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
}
}
}
...そして、レイアウトビューについては、これが私のgroup_items.xmlがどのように見えるかです
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:id="@+id/group_heading"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingLeft="20dp"
Android:paddingTop="16dp"
Android:paddingBottom="16dp"
Android:textSize="15sp"
Android:textStyle="bold"/>
<ImageView
Android:id="@+id/group_indicator"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@Android:drawable/arrow_down_float"
Android:layout_alignParentRight="true"
Android:paddingRight="20dp"
Android:paddingTop="20dp"/>
<ImageView
Android:id="@+id/group_indicator2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@Android:drawable/arrow_up_float"
Android:layout_alignParentRight="true"
Android:visibility="gone"
Android:paddingRight="20dp"
Android:paddingTop="20dp"/>
それが役立つことを願っています...賛成票を残すことを忘れないでください
ExpandableListView
の属性Android:groupIndicator="@null"
を変更しようとしましたか?