Изменить расширяемый индикатор в ExpandableListView

Я пытаюсь создать ExpandableListView. Начальный вид с группами отображается хорошо. Однако, когда я нажимаю элемент списка, моя стрелка не изменяется. См. Изображения ниже.

Введите описание изображения здесь

Как изменить направление стрелки?

У меня есть формат XML:

<ExpandableListView android:id="@+id/expandable_list" android:layout_width="fill_parent" android:layout_height="match_parent" android:divider="@null" android:background="#ffffff" android:groupIndicator="@drawable/settings_selector" android:transcriptMode="alwaysScroll" /> 

Settings_selector.xml :

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

Расширяемый список

  <ExpandableListView android:id="@+id/expandable_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:groupIndicator="@drawable/group_indicator" android:transcriptMode="alwaysScroll" /> 

setindicator здесь iam, используя код setindicator, как это, этот рабочий приятный

  DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int width = metrics.widthPixels; mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list); mExpandableList.setIndicatorBounds(width - GetPixelFromDips(50), width - GetPixelFromDips(10)); public int GetPixelFromDips(float pixels) { // Get the screen's density scale final float scale = getResources().getDisplayMetrics().density; // Convert the dps to pixels, based on density scale return (int) (pixels * scale + 0.5f); } 

Рез / рисуем / group_indicator

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

Попробуйте это для ваших settings_selector.xml :

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

Я пошел по пути ниже: решите, чтобы левая / правая линия была доступна для вашего группового витрины на основе флажка isExpanded.
Таким образом, нам легче настраивать дополнение / фон и другие элементы индикатора.

Надеюсь, поможет.

  public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = (TextView) mLayoutInflater.inflate(R.layout.menu_group, null); textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, isExpanded ? 0 : android.R.drawable.ic_menu_more, 0); textView.setText(getGroup(groupPosition).toString()); return textView; } 
 import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.database.DataSetObserver; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; public class MyActivity extends Activity { private ExpandableListView mExpandableList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list); mExpandableList.setGroupIndicator(null); ArrayList<Parent> arrayParents = new ArrayList<Parent>(); ArrayList<String> arrayChildren = new ArrayList<String>(); //here we set the parents and the children for (int i = 0; i < 10; i++){ //for each "i" create a new Parent object to set the title and the children Parent parent = new Parent(); parent.setTitle("Parent " + i); arrayChildren = new ArrayList<String>(); for (int j = 0; j < 10; j++) { arrayChildren.add("Child " + j); } parent.setArrayChildren(arrayChildren); //in this array we add the Parent object. We will use the arrayParents at the setAdapter arrayParents.add(parent); } //sets the adapter that provides data to the list. mExpandableList.setAdapter(new MyCustomAdapter(MyActivity.this,arrayParents)); } public class Parent { private String mTitle; private ArrayList<String> mArrayChildren; public String getTitle() { return mTitle; } public void setTitle(String mTitle) { this.mTitle = mTitle; } public ArrayList<String> getArrayChildren() { return mArrayChildren; } public void setArrayChildren(ArrayList<String> mArrayChildren) { this.mArrayChildren = mArrayChildren; } } public class MyCustomAdapter extends BaseExpandableListAdapter implements OnClickListener{ private LayoutInflater inflater; private ArrayList<Parent> mParent; public MyCustomAdapter(Context context, ArrayList<Parent> parent){ mParent = parent; inflater = LayoutInflater.from(context); } @Override //counts the number of group/parent items so the list knows how many times calls getGroupView() method public int getGroupCount() { return mParent.size(); } @Override //counts the number of children items so the list knows how many times calls getChildView() method public int getChildrenCount(int i) { return mParent.get(i).getArrayChildren().size(); } @Override //gets the title of each parent/group public Object getGroup(int i) { return mParent.get(i).getTitle(); } @Override //gets the name of each item public Object getChild(int i, int i1) { return mParent.get(i).getArrayChildren().get(i1); } @Override public long getGroupId(int i) { return i; } @Override public long getChildId(int i, int i1) { return i1; } @Override public boolean hasStableIds() { return true; } @Override //in this method you must set the text to see the parent/group on the list public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { if (view == null) { view = inflater.inflate(R.layout.list_item_parent, viewGroup,false); } view.findViewById(R.id.button).setTag(i); view.findViewById(R.id.button).setOnClickListener(this); TextView textView = (TextView) view.findViewById(R.id.list_item_text_view); //"i" is the position of the parent/group in the list textView.setText(getGroup(i).toString()); //return the entire view return view; } @Override //in this method you must set the text to see the children on the list public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) { if (view == null) { view = inflater.inflate(R.layout.list_item_child, viewGroup,false); } TextView textView = (TextView) view.findViewById(R.id.list_item_text_child); //"i" is the position of the parent/group in the list and //"i1" is the position of the child textView.setText(mParent.get(i).getArrayChildren().get(i1)); //return the entire view return view; } @Override public boolean isChildSelectable(int i, int i1) { return true; } @Override public void registerDataSetObserver(DataSetObserver observer) { /* used to make the notifyDataSetChanged() method work */ super.registerDataSetObserver(observer); } /* (non-Javadoc) * @see android.view.View.OnClickListener#onClick(android.view.View) * @since Mar 20, 2013 * @author rajeshcp */ @Override public void onClick(View v) { if(mExpandableList.isGroupExpanded((Integer)v.getTag())) { mExpandableList.collapseGroup((Integer)v.getTag()); }else { mExpandableList.expandGroup((Integer)v.getTag()); } } } } 

Измените свой MyActivity как это, и дайте мне знать, что еще вы хотите?

предмет:

  int width = getResources().getDisplayMetrics().widthPixels; if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) { listView.setIndicatorBounds(width - getPixelValue(40), width - getPixelValue(10)); } else { listView.setIndicatorBoundsRelative(width - getPixelValue(40), width - getPixelValue(10)); } 

И вспомогательный метод:

 public static int getPixelValue(int dp) { final float scale = getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); }