Antworten:
Versuchen Sie dies >>>
für alle Artikel
getExpandableListView().setGroupIndicator(null);
In XML
android:groupIndicator="@null"
Das android:groupIndicator
Eigenschaft hat einen Status aktiviert, der gezeichnet werden kann. Das heißt, Sie können unterschiedliche Bilder für unterschiedliche Zustände festlegen.
Wenn die Gruppe keine Kinder hat, lautet der entsprechende Status 'state_empty'.
Siehe diese Referenzlinks:
Zum state_empty
, können Sie ein anderes Bild gesetzt , die nicht verwirrend ist, oder einfach transparente Farbe Display nichts verwenden ...
Fügen Sie diesen Artikel zusammen mit anderen in Ihr Stateful Drawable ein ....
<item android:state_empty="true" android:drawable="@android:color/transparent"/>
Ihre Statelliste kann also folgendermaßen aussehen:
<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>
Wenn Sie eine ExpandableListActivity verwenden, können Sie den Gruppenindikator in onCreate wie folgt festlegen:
getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.my_group_statelist));
Ich habe dies getestet, um zu funktionieren.
Basierend auf der Antwort von StrayPointer und dem Code aus dem Blog können Sie den Code noch weiter vereinfachen:
Fügen Sie in Ihrer XML das Folgende zu ExpandableListView hinzu:
android:groupIndicator="@android:color/transparent"
Dann machen Sie im Adapter Folgendes:
@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 );
}
}
Mit der setImageResource-Methode erledigen Sie alles mit einem Einzeiler. Sie benötigen die drei Integer-Arrays in Ihrem Adapter nicht. Sie benötigen auch keinen XML-Selektor für den erweiterten und reduzierten Status. Alles wird über Java erledigt.
Außerdem zeigt dieser Ansatz auch den richtigen Indikator an, wenn eine Gruppe standardmäßig erweitert wird, was mit dem Code aus dem Blog nicht funktioniert.
getGroupView()
Methode Ihrer BaseExpandableListAdapter
Implementierung verwendet werden. Schauen Sie sich diese Beispielimplementierung an .
ViewHolder
Muster. indicator
ist der Variablenname des Ansichtsinhabers.
Wie in einer anderen Antwort erwähnt, wird das Symbol nicht gezeichnet, da Android eine nicht erweiterte Listengruppe als leer behandelt, selbst wenn die Gruppe untergeordnete Elemente hat.
Dieser Link hat das Problem für mich behoben: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html
Grundsätzlich müssen Sie das Standard-Drawable als transparent festlegen, das Drawable als ImageView in Ihre Gruppenansicht verschieben und das Bild in Ihrem Adapter umschalten.
Verwenden Sie in Ihrem Code einfach die benutzerdefinierte XML-Liste für Gruppen und fügen Sie die ImageView für GroupIndicator ein .
Fügen Sie in Ihrem ExpandableListAdapter die folgenden Arrays hinzu
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
};
Fügen Sie auch in der ExpandableListAdapter- Methode dieselben Dinge wie unten hinzu
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;
}
Referenz: http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html
In XML
android:groupIndicator="@null"
In ExpandableListAdapter
-> getGroupView
folgenden Code kopieren
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);
}
}
Dies könnte ein anderer Weg von XML sein, gesetzt android:groupIndicator="@null"
Referenzlink: https://stackoverflow.com/a/5853520/2624806
Schlagen Sie mir meine Lösung vor:
1) Standard-Gruppenindikator löschen:
<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) in 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;
}
Ich wollte nur Mihir Trivedis Antwort verbessern. Sie können dies in getGroupView () platzieren, das sich in der MyExpandableListAdapter-Klasse befindet
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]);
}
}
}
... und was die Layoutansicht betrifft, so sieht meine group_items.xml so aus
<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"/>
Hoffe das hilft ... denk daran, eine positive Bewertung abzugeben
Verwenden Sie dies, es funktioniert perfekt für mich.
<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>
Haben Sie versucht, ExpandableListView
das Attribut zu ändern android:groupIndicator="@null"
?
Sie erstellen einfach ein neues XML-Layout mit height = 0 für den ausgeblendeten Gruppenheader. Zum Beispiel ist es '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>
Dann lautet Ihr normales Gruppenheader-Layout '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>
Schließlich aktualisieren Sie einfach die getGroupView-Methode in Ihrer Adapterklasse:
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;
}
}
}
WICHTIG : Das Root-Tag der Layoutdateien (versteckt und normal) muss unterschiedlich sein (wie im obigen Beispiel LinearLayout und RelativeLayout).
convertView.setVisibility (View.GONE) sollte den Trick machen.
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
DistanceHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_search_distance_header, parent, false);
if (getChildrenCount(groupPosition)==0) {
convertView.setVisibility(View.GONE);
}