更改ExpandableListView中的可展开指标
我试图创build一个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
here 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); }
RES /抽拉/ 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标志决定你的groupView的左/右drawable。
通过这种方式,我们可以更容易地自定义指标的填充/背景和其他内容。
希望它有帮助。
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); }